如何有效地解析最多两个深度与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"
。
似乎JValue.ToString()
的预期行为是将封闭的值作为字符串返回,而不是编码为JSON。相反,JValue.ToString(IFormatProvider)
应该用来生成一个有效的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>();