一种简单的方法是分配您的类的实例,然后使用
JsonSerializer.Populate(JsonReader,Object)。这是在标准中完成的方式
CustomCreationConverter<T>:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){ if (reader.Value != null && reader.ValueType == typeof(string)) { return someSpecialDataTypeInstance; } else if (reader.TokenType == JsonToken.StartObject) { existingValue = existingValue ?? serializer.ContractResolver.ResolveContract(objectType).DefaultCreator(); serializer.Populate(reader, existingValue); return existingValue; } else if (reader.TokenType == JsonToken.Null) { return null; } else { throw new JsonSerializationException(); }}局限性:
- 如果
TypeNameHandling
启用了"$type"
该功能,并且存在指定多态子类型的属性,则无法处理这种情况。
在这种情况下,你需要做一些招数利用通过
JsonDerivedTypeConverer<T>在
JsonConverter与接口 。
要反序列化的类型必须具有Json.NET可访问的无参数构造函数。如果不是,并且
existingValue
为null,则必须通过手动进行构造new DataType(arg1, arg2, ...)
。PreserveReferencesHandling
不支持引用保存。
有关处理这种情况的一种方法,请参见
如何根据json的结构选择要在运行时反序列化的类型? 。
样品提琴。



