如何将NewtonsoftJson.NET引用反序列化为单独的单个实例我有一段JSON,如下所示:[{"$id":"1","Name":"James","BirthDate":"1983-03-08T00:00Z","LastModified":"2012-03-21T05:40Z"},{"$ref":"1"}]正如您可以通过$ref看出的那样,此JSON数组两次包含同一个人(James)。第二次是对第一次的参考。我想知道是否有办法将此JSON反序列化为包含两个james副本的对象。目前,我正在使用这个:vardeserializedPersons=JsonConvert.DeserializeObject(json,jsonSerializer)但这只是给了我一个数组,其中包含相同的Person实例两次:object.ReferenceEquals(deserializedPersons[0],deserializedPersons[1])//评估为是的,我找到了一个我不满意的解决方法,它只是反序列化JSON字符串,然后使用上面的jsonSerializerSettings对其进行序列化,这将复制JSON中的人,然后再次反序列化。这导致我们正在处理的大型对象严重减速。注意:我知道我可以更改从中检索此JSON的API以复制数据,但保留引用可以在通过网络发送响应JSON时节省大量空间。您可以使用自定义引用解析器。例如,假设Name是对象的“主键”,这应该可行。当然,您可能想让它更通用。公共类PersonReferenceResolver:IReferenceResolver{privatereadonlyIDictionary_objects=newDictionary();publicobjectResolveReference(objectcontext,stringreference){Personp;if(_objects.TryGetValue(reference,outp)){//这是“聪明”的一点。我们没有返回找到的对象,而是返回它的一个副本。//在这里克隆你的类可能更好...returnnewPerson{Name=p.Name,BirthDate=p.BirthDate,LastModified=p.LastModified};}返回空值;}publicstringGetReference(objectcontext,objectvalue){Personp=(Person)value;_objects[p.Name]=p;返回p.Name;}publicboolIsReferenced(objectcontext,objectvalue){Personp=(Person)value;返回_objects.ContainsKey(p.Name);}publicvoidAddReference(objectcontext,stringreference,objectvalue){_objects[reference]=(Person)value;}}现在你像这样反序列化:varjsonSerializerSettings=newJsonSerializerSettings(){ReferenceResolver=newPersonReferenceResolver()};vardeserializedPersons=JsonConvert.DeserializeObject(json,jsonSerializerSettings);编辑:我很无聊,所以我做了一个通用版本:私有只读函数_keyReader;publicGenericResolver(FunckeyReader){_keyReader=keyReader;}publicobjectResolveReference(objectcontext,stringreference){TEntityo;if(_objects.TryGetValue(reference,outo)){returno.Clone();}返回空值;}publicstringGetReference(objectcontext,objectvalue){varo=(TEntity)value;varkey=_keyReader(o);_objects[键]=o;返回键;}publicboolIsReferenced(objectcontext,objectvalue){varo=(TEntity)value;返回_objects.ContainsKey(_keyReader(o));}publicvoidAddReference(objectcontext,stringreference,objectvalue){if(valueisTEntity)_objects[reference]=(TEntity)value;}}略带新用法:上面说的就是C#学教程:如何将NewtonsoftJson.NET引用反序列化为单独的单个实例。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—varjsonSerializerSettings=newJsonSerializerSettings(){//现在我们需要指定类型以及如何获取对象的keyReferenceResolver=newGenericResolver(p=>p.Name)};vardeserializedPersons=JsonConvert.DeserializeObject>(json,jsonSerializerSettings);不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处:
