【问题标题】:Newtonsoft json deserialization - key as propertyNewtonsoft json 反序列化 - 键作为属性
【发布时间】:2015-01-01 03:54:07
【问题描述】:

我有一个 json 文件:

...
    "Key1": {
        "Base": 123,
        "Max": 1234
    },
    "Key2": {
        "Base": 123,
        "Max": 1234
    },
    "Key3": {
        "Base": 123,
        "Max": 1234
    },
...

我需要用JsonConvert.DeserializeObject<T>(__json);将它反序列化成一个对象

但我需要使用键 (Key1, Key2, Key3,...) 作为我的反序列化对象的属性。 不幸的是,我无法使用其他反序列化方法,也无法修改 json 格式。

我的对象是这样的

public class Item {
    public string Id { get; set; }
    public int Base { get; set; }
    public int Max { get; set; }
}

我的 ID 应该是 "Key1", "Key2, ...

有可能吗?

【问题讨论】:

  • 为什么不列出具有BaseMax 属性的自定义Key 类?然后,您可以使用循环枚举每个 Key 的属性
  • 是的,据我所知,唯一的方法是使用自定义反射方法。这一点也不坏,但我认为没有任何内置功能可以做到这一点。
  • 真实对象更复杂,在子对象上有一些 OnDeserialization 属性,键(一个枚举)用于计算一些数据。我使用了一个从自动生成的文件反序列化的大框架,我无法更改反序列化过程或 json。但我可以添加 JsonConverter、ContractResolver、CustomConverter、属性或任何其他类似的东西,但我只能更新我的类。

标签: c# json json.net json-deserialization


【解决方案1】:

制作一个自定义的Key 类:

public class Key {
    public int Base { get; set; }
    public int Max { get; set; }
}

然后将 JSON 结果中的每个项目存储在 Dictionary 中,其中键是键名,值是 Key 项目:

var keyCollection = new Dictionary<string, Key>();

//you can then do stuff such as:
var maxOfKeyOne = keyCollection["Key1"].Max; 
var baseOfKeyTwo = keyCollection["Key2"].Base;

【讨论】:

  • 最后我使用了一个字典,并使用 OnDeserialized 方法构建了我的子对象,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多