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
相关产品推荐
相关产品推荐

