[英]Deserialize derived classes using Json.net without using JObject
我有一个需要反序列化的大型json数据集。 我正在使用Json.net的JsonTextReader
读取数据。
我的问题是我需要反序列化一些派生类,因此我需要能够“向前看”定义数据类型的特定属性。 在下面的示例中,“ type”参数用于确定要反序列化的对象类型。
{
type: "groupData",
groupParam: "groupValue1",
nestedObject:
{
type: "groupData",
groupParam: "groupValue2",
nestedObject:
{
type: "bigData",
arrayData: [ ... ]
}
}
我的派生对象可以被大量嵌套并且非常深。 不需要将整个数据集加载到内存中,因为这将需要大量内存。 一旦找到“ bigData”对象,就将处理数据(例如上面示例中的数组),但不会将其存储在内存中(它太大)。
到目前为止,我所见问题的所有解决方案都利用JObject
对部分对象进行反序列化。 我想避免使用JObject
因为它将反复反序列化层次结构中的每个对象。
如何解决反序列化问题?
有什么方法可以搜索“ type”参数,然后回溯到对象的{字符的开头以开始处理?
无论如何,我都不知道为了指定先行(至少在Json.NET中不是)会尝试加载对象,但是您可以使用其他基于属性的配置项来忽略不需要的属性:
public class GroupData {
[JsonIgnore]
public string groupParam { get; set; }
[JsonIgnore]
public GroupData nestedObject { get; set; }
public string[] arrayData { get; set; }
}
另外,您可以尝试自定义创建转换器 :
例如..
public class GroupData {
[JsonIgnore]
public string groupParam { get; set; }
[JsonIgnore]
public GroupData nestedObject { get; set; }
}
public class BigData : GroupData {
public string[] arrayData { get; set; }
}
public class ObjectConverter<T> : CustomCreationConverter<T>
{
public ObjectConverter() { }
public override bool CanConvert(Type objectType)
{
return objectType.Name == "BigData";
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Some additional checks/work?
serializer.Populate(reader, target);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.