JsonConverter解决参考 [英] JsonConverter resolve reference

查看:77
本文介绍了JsonConverter解决参考的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆