【问题标题】:Deserialize JSON with $ in property names在属性名称中使用 $ 反序列化 JSON
【发布时间】:2020-05-02 04:50:37
【问题描述】:

我有以下 JSON 对象(对象的形状会有所不同,因此使用动态):

{
    "mba$maccType": [{
        "class": {
            "id": 1057,
            "intlId": "cacc"
        },
        "classA": false,
        "endDate": "4712-12-31T00:00:00",
        "histStatus": {
            "id": 5,
            "intlId": "valid"
        },
        "objClassif": {
            "id": 74,
            "intlId": "mba$macc_type"
        },
        "secUser": {
            "id": 2
        },
        "startDate": "2018-12-01T00:00:00",
        "timestamp": "2020-01-18T07:29:21"
    }
]
}

我使用Newtonsoft.Json解析如下:

dynamic dyn = JObject.Parse(json);

我的问题是,我无法引用任何动态属性,因为包含 $ 的父属性给出了语法错误:

Console.WriteLine(dyn.mba$maccType);

如何获得“class.intlId”(即“cacc”)的值?

【问题讨论】:

标签: c# json json.net


【解决方案1】:

您可以将 JSON 解析为 JObject 而不是 dynamic 类型,并通过键访问其项目。就像从mba$maccType 获取第一项(因为它是一个数组),然后从中访问class 令牌和intlId

var jObject = JObject.Parse(json);
var firstItem = jObject["mba$maccType"]?.FirstOrDefault();
var result = firstItem?["class"]?["intlId"]?.ToString(); // returns "cacc"

【讨论】:

    【解决方案2】:

    假设 JSON 结构的唯一动态部分是外部对象上的属性名称,您可以将此 JSON 反序列化为 Dictionary<string, List<T>>。这样做的好处是您可以为几乎所有反序列化的内容明确定义类型。

    // type definitions
    class ClassRecord
    {
        public int id { get; set; }
        public string intlId { get; set; }
    }
    
    class Item
    {
        public ClassRecord @class { get; set; }
        public bool classA { get; set; }
    
        // etc.
    }
    
    // deserialize
    var obj = JsonConvert.DeserializeObject<Dictionary<string, List<Item>>>(json);
    
    Console.WriteLine(obj["mba$maccType"][0].@class.id); // 1057
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多