c# - 在不使用 JObject 的情况下使用 Json.net 反序列化派生类

标签 c# json json.net

我有一个需要反序列化的大型 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; }
}

或者,您可以提供 custom creation converters尝试一下:

例如..

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);
    }
}

关于c# - 在不使用 JObject 的情况下使用 Json.net 反序列化派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555223/

相关文章:

c# - 将 System.Drawing.Points 加在一起

c# - Xamarin Forms Rg.Plugins.Popup

java - JSON 对象到 Arraylist

php - 再次将mysql中存储的字符串转换为php : eval()

c# - Json 到 C# 对象处理动态属性

.net - 将 JObject 转换为强类型对象

c# - 如何阻止 Facebook 应用程序请求任何权限?

c# - 当行具有空值时, Entity Framework 返回空对象

c# - 使用类似数据解析 .NET 中的嵌套 JSON

json - 如何使用 swift 计算 JSON 的总数据?