我有一个自定义的JsonConverter,它在反序列化期间处理派生类型的创建,在大多数情况下,它按预期工作。 我遇到问题的情况是,当json结构中有引用的对象时。 当我们检测到引用时,是否可以依赖默认的反序列化? ReadJson方法应该返回什么? 在下面的示例中,我们在引用的情况下返回null。
if (reader.TokenType == JsonToken.Null) return null;
var jObject = JObject.Load(reader);
JToken token;
if (jObject.TryGetValue("$ref", out token))
{
return null;
}
或者我们必须实现自定义的ReferenceResolver,因为默认值不能在转换器中使用(仅限内部使用)?
欢迎任何建议。
答案 0 :(得分:3)
经过一些额外的测试,我自己找到了解决方案。当我第一次尝试使用默认的ReferenceResolver时,我得到了一个异常说" DefaultReferenceResolver只能在内部使用。"。这指向了错误的方向,你可以在你的转换器中使用DefaultReferenceResolver,但我用错误的方式调用它...
解决方案:
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
}