You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:20:48