JsonConverter解决参考 [英] JsonConverter resolve reference
问题描述
我有一个自定义的JsonConverter,它在反序列化期间处理派生类型的创建,在大多数情况下,这可以按预期工作. 我遇到问题的情况是,在json结构中有引用的对象时. 我们在检测到引用时是否可以依赖默认的反序列化? ReadJson方法应该返回什么? 在下面的示例中,如果有引用,我们将返回null.
I have a custom JsonConverter which handles the creation of derived types during deserialization, in most cases this works as expected. The situation where I have an issue is, when there are referenced objects in the json structure. Is it possible to rely on the default deserialization when we detect a reference? What should the ReadJson method return? In the sample below we return null in case of a reference.
if (reader.TokenType == JsonToken.Null) return null;
var jObject = JObject.Load(reader);
JToken token;
if (jObject.TryGetValue("$ref", out token))
{
return null;
}
还是我们必须实现自定义的ReferenceResolver,因为默认转换器不能在转换器中使用(仅供内部使用)?
Or must we implement a custom ReferenceResolver as the default one can't be used in the converter (only internal use)?
欢迎提出任何建议.
推荐答案
经过一些额外的测试,我自己找到了解决方案.当我第一次尝试使用默认的ReferenceResolver时,出现了一个异常:"DefaultReferenceResolver只能在内部使用.".这指出了我的错误方向,您可以在转换器中使用DefaultReferenceResolver,但是我用错误的方式称呼它...
After some extra testing, I found the solution myself. When I first was trying using the default ReferenceResolver I got an exception saying "The DefaultReferenceResolver can only be used internally.". This pointed my in the wrong direction, you can use the DefaultReferenceResolver in your converter but I was calling it the wrong way...
解决方案:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
var jObject = JObject.Load(reader);
string id = (string)jObject["$ref"];
if (id != null)
{
return serializer.ReferenceResolver.ResolveReference(serializer, id);
}
// Custom instance creation comes here
}
这篇关于JsonConverter解决参考的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!