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

C#中解码特殊结构Object-based JSON数组的优化方法问询

优化嵌套JSON解析方案(无需dynamic)

针对你这种来自大型机的嵌套JSON结构,不用dynamic也能优雅地解析数据,利用Newtonsoft.Json的强类型JObject/JProperty API就能直接获取所需值,避免运行时类型风险和冗余的遍历代码。

核心思路

顶层JSON对象的每个子节点都是JProperty(对应版本名称,比如"133v1"),其Value是另一个JObject,里面的子节点又是JProperty(对应传感器ID和日期的键值对)。直接遍历这些JProperty集合即可,不用嵌套调用Children()和Single()。

优化后的代码示例

// 解析JSON为JObject
JObject sensorObj = JObject.Parse(sensors);

// 遍历所有版本项
foreach (JProperty versionProperty in sensorObj.Properties())
{
    // 获取版本名称(如"133v1"、"1092v8")
    string versionName = versionProperty.Name;
    
    // 取出当前版本下的传感器数据对象
    JObject sensorDataObj = (JObject)versionProperty.Value;
    
    // 遍历当前版本下的所有传感器键值对
    foreach (JProperty sensorProperty in sensorDataObj.Properties())
    {
        // 获取传感器ID(如"128"、"589")
        string sensorId = sensorProperty.Name;
        // 获取日期字符串,如需转为DateTime可额外处理
        string dateStr = sensorProperty.Value.ToString();
        
        // 这里添加你的业务逻辑,比如存储数据、打印等
        // Console.WriteLine($"版本: {versionName}, 传感器ID: {sensorId}, 日期: {dateStr}");
    }
}

方案优势

  • 强类型安全:全程使用Newtonsoft.Json的强类型API,编译期即可检查类型错误,避免dynamic带来的运行时异常
  • 代码简洁可读:直接通过Name和Value属性获取数据,无需复杂的Children()嵌套调用,逻辑一目了然
  • 性能更优:避免dynamic的运行时类型解析开销,解析效率更高

额外优化(可选)

如果需要将日期字符串转为DateTime类型,可以添加类型转换逻辑,确保数据准确性:

if (DateTime.TryParse(sensorProperty.Value.ToString(), out DateTime sensorDate))
{
    // 使用转换后的DateTime对象
}
else
{
    // 处理日期格式错误的情况
}

内容的提问来源于stack exchange,提问作者Coyttl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:32:43