如何从Newtonsoft.Json.Linq.JProperty访问键值并转换嵌套JSON为字典
问题
我有一个结构嵌套且动态的JSON数据,希望将其转换为Dictionary<string, Dictionary<string,long>>类型的字典(日期作为第一层键,item1等作为第二层键)。JSON结构示例如下:
{ "xyz": { "xyzcharacteristic1": { "2022/10/01": { "item1": 0, "item4": 11111, "item2": 33333, "item3": 33333 }, "2022-09-05": { "item2": 0, "item1": 11111, "item3": 22222, "item4": 22222 } }, "xyzcharacteristic2": {}, "xyzcharacteristic3": {} }, "xyy": { "xyycharacteristic1": {} } }
我尝试了以下解析代码,但无法单独访问JProperty中的键值:
string json = r.ReadToEnd(); var rss = JObject.Parse(json); var dates= ((JObject)rss["xyz"]["xyzcharacteristic1"]).Properties(); foreach (var item in dates) { Console.WriteLine(item); }
解决方案
要将目标JSON节点转换为Dictionary<string, Dictionary<string, long>>,可以通过以下两种方式实现:
方法一:直接类型转换(推荐)
利用Json.NET的序列化能力,直接将目标JObject节点转换为目标字典类型,代码简洁高效:
string json = r.ReadToEnd(); var rss = JObject.Parse(json); // 定位到目标节点:xyz -> xyzcharacteristic1 var targetNode = (JObject)rss["xyz"]["xyzcharacteristic1"]; // 直接转换为目标字典类型 Dictionary<string, Dictionary<string, long>> result = targetNode.ToObject<Dictionary<string, Dictionary<string, long>>>();
方法二:手动遍历构建
如果需要对数据做额外处理(比如统一日期格式、异常值过滤),可以手动遍历JProperty构建字典:
string json = r.ReadToEnd(); var rss = JObject.Parse(json); var dateProperties = ((JObject)rss["xyz"]["xyzcharacteristic1"]).Properties(); var result = new Dictionary<string, Dictionary<string, long>>(); foreach (var dateProp in dateProperties) { // 提取日期作为第一层键 string dateKey = dateProp.Name; // 初始化内层字典 var innerDict = new Dictionary<string, long>(); // 遍历内层item的键值对 var itemProperties = ((JObject)dateProp.Value).Properties(); foreach (var itemProp in itemProperties) { // 尝试将值转换为long类型,添加容错逻辑 if (long.TryParse(itemProp.Value.ToString(), out long value)) { innerDict[itemProp.Name] = value; } } result[dateKey] = innerDict; }
额外提示
- 示例JSON中日期格式不统一(
2022/10/01和2022-09-05),可以在遍历过程中统一格式(比如转换为yyyy-MM-dd),避免字典键冲突。 - 手动遍历建议保留异常处理逻辑,防止JSON中出现非数值类型导致程序报错。
内容的提问来源于stack exchange,提问作者JPWilson
相关产品推荐
相关产品推荐

