使用Json.net反序列化派生类而不使用JObject

Mat*_*ser 8 c# json json.net

我有一个需要反序列化的大型json数据集.我正在使用Json.net JsonTextReader来读取数据.

我的问题是我需要反序列化一些派生类,所以我需要能够"向前看"定义我的数据类型的特定属性.在下面的示例中,"type"参数用于确定要反序列化的对象类型.

{
  type: "groupData",
  groupParam: "groupValue1",
  nestedObject: 
  {
    type: "groupData",
    groupParam: "groupValue2",
    nestedObject:
    {
      type: "bigData",
      arrayData: [ ... ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

我的派生对象可以大量嵌套并且非常深.不希望将整个数据集加载到内存中,因为它需要大量内存.一旦我开始使用"bigData"对象,我将处理数据(例如上面示例中的数组),但它不会存储在内存中(它太大了).

到目前为止,我所看到的所有问题解决方案都用于JObject反序列化部分对象.我想避免使用,JObject因为它会反复地反序列化层次结构中的每个对象.

如何解决反序列化问题?

有没有办法提前搜索"type"参数,然后回溯到对象的{字符开始处理?

Stu*_*lor 1

我不知道无论如何要预先加载对象以指定前瞻(至少不在 Json.NET 中),但您可以使用其他基于属性的配置项来忽略不需要的属性:

public class GroupData {
    [JsonIgnore]
    public string groupParam { get; set; }
    [JsonIgnore]
    public GroupData nestedObject { get; set; }

    public string[] arrayData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试自定义创建转换器:

例如..

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);
    }
}
Run Code Online (Sandbox Code Playgroud)