如何有效地解析最多两个深度与Json.NET

本文关键字:两个 深度 NET Json 有效地 | 更新日期: 2023-09-27 18:02:16

给出如下Json输入:

{
    "Group A": {
        "Prop A": 42,
        "Prop B": true,
        "Prop C": [ "Hello", "World!" ]
    },
    "Group B": {
        "Prop A": 72
    }
}

我想填充以下数据结构:

Dictionary<string, Dictionary<string, string>> Groups;

使得下面的语句为真(空格的不同并不重要):

Groups["Group A"]["Prop C"] == "['"Hello'",'"World!'"]"

低效率的解决方案:

下面的似乎可以解决这个问题,但它效率很低,因为它会导致不必要的中间序列化:

Groups = new Dictionary<string, Dictionary<string, string>>();
foreach (var jsonGroup in JObject.Parse(jsonText)) {
    var group = new Dictionary<string, string>();
    Groups[jsonGroup.Key] = group;
    foreach (var jsonProperty in jsonGroup.Value.Children<JProperty>())
        group[jsonProperty.Name] = JsonConvert.SerializeObject(jsonProperty.Value);
}

遗憾的是,JProperty.Value.ToString()似乎返回奇数值,例如,"False"而不是"false"

如何有效地解析最多两个深度与Json.NET

似乎JValue.ToString()的预期行为是将封闭的值作为字符串返回,而不是编码为JSON。相反,JValue.ToString(IFormatProvider)应该用来生成一个有效的JSON编码字符串。

https://github.com/JamesNK/Newtonsoft.Json/issues/266

然而,在我的特殊情况下,保留Json似乎更有意义。. NET表示,因为这避免了多次重新解析相同的JSON内容:
Groups = new Dictionary<string, Dictionary<string, JToken>>();
foreach (var jsonGroup in JObject.Parse(jsonText)) {
    var group = new Dictionary<string, JToken>();
    Groups[jsonGroup.Key] = group;
    foreach (var jsonProperty in jsonGroup.Value.Children<JProperty>())
        group[jsonProperty.Name] = jsonProperty.Value;
}

然后,而不是用JObject.Parse解析这些子结构,我可以使用JToken.ToObject<T>将它们转换成所需的表示:

bool myValue = Groups["Group A"]["Prop B"].ToObject<bool>();