使用Json.net反序列化派生类而不使用JObject
本文关键字:JObject Json net 反序列化 派生 使用 | 更新日期: 2023-09-27 18:13:40
我有一个大的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);
}
}