如何指定JSON路径提取ModbusSerial.Port_1.COM3.Power数值
提取MTConnectStreams JSON中指定字段的值
核心路径修正
你之前的代码路径漏了DeviceStream层级,正确的顶层路径应该是data12_json['MTConnectStreams']['Streams']['DeviceStream']['ComponentStream'],接下来分两种方式提取目标值:
方式一:固定索引快速提取(结构稳定时用)
如果能确定ModbusSerial.Port_1.COM3对应的是ComponentStream数组的第二个元素(索引为1),可以直接定位:
# 定位到COM3组件 com3_component = data12_json['MTConnectStreams']['Streams']['DeviceStream']['ComponentStream'][1] # 遍历Events找Power字段 for item in com3_component['Events']['Other']: if item['@dataItemId'] == 'ModbusSerial.Port_1.COM3.Power': power_value = item['#text'] print(power_value) # 输出结果:60.85923 break
方式二:遍历匹配提取(结构可能变化时用)
如果不确定数组索引,通过匹配@componentId来定位组件,兼容性更强:
# 遍历所有组件 for component in data12_json['MTConnectStreams']['Streams']['DeviceStream']['ComponentStream']: if component['@componentId'] == 'ModbusSerial.Port_1.COM3': # 在当前组件的Events里找Power字段 for item in component['Events']['Other']: if item['@dataItemId'] == 'ModbusSerial.Port_1.COM3.Power': power_value = item['#text'] print(power_value) # 输出结果:60.85923 break break
关键注意点
- 目标字段
Power属于组件的Events->Other数组,不是Samples,别找错层级; - 所有带
@和#的键名要完整写对,比如@dataItemId、#text,不能漏符号。
内容的提问来源于stack exchange,提问作者sdstncl
相关产品推荐
相关产品推荐

