Node-Red中读取设备JSON数据失败的问题求助
解决Node-RED中读取设备JSON数据的问题
问题原因分析
- JSON节点报错
Unexpected token in JSON at position 0:大概率是HTTP Get请求返回的字符串带有UTF-8字节顺序标记(BOM),或者包含多余空白/非JSON前缀字符,导致JSON解析器无法识别。 - Function节点报错
TypeError: Cannot read properties of undefined (reading 'S'):- 冗余操作:
JSON.stringify(msg.payload)再JSON.parse(str)完全没必要——如果msg.payload已经是解析后的JSON对象,这步纯浪费性能;如果是带BOM的字符串,parse会失败,导致data为undefined。 - 返回值错误:
return msg, data;是JavaScript逗号运算符,实际返回的是data而非标准msg对象,破坏了Node-RED的消息流结构。
- 冗余操作:
正确解决方案
方案1:单Function节点完成清理、解析与提取(推荐)
在HTTP节点之后添加一个Function节点,处理可能的格式问题并提取目标数据:
// 处理UTF-8 BOM和多余空白 if (typeof msg.payload === 'string') { // 移除开头的BOM字符 msg.payload = msg.payload.replace(/^\uFEFF/, '').trim(); // 解析为JSON对象 msg.payload = JSON.parse(msg.payload); } // 安全提取温度值(添加容错判断,避免结构缺失报错) if (msg.payload?.Monitor?.S?.S1?.item1?.value) { msg.payload = msg.payload.Monitor.S.S1.item1.value; } else { node.error('设备返回数据结构异常,无法提取温度值'); msg.payload = null; // 可根据需求设置默认值 } return msg;
方案2:拆分步骤(Function + JSON节点)
- 在HTTP节点后加Function节点清理字符串:
// 移除BOM和空白字符 msg.payload = msg.payload.replace(/^\uFEFF/, '').trim(); return msg;
- 连接JSON节点(自动将字符串解析为JSON对象)
- 再添加Function节点提取数据:
// 安全提取目标值,异常时返回提示 msg.payload = msg.payload?.Monitor?.S?.S1?.item1?.value || '数据异常'; return msg;
关键注意事项
- 先确认
msg.payload类型:可在Function节点中添加node.warn(typeof msg.payload)查看是string还是object——如果是object,说明HTTP节点已自动解析JSON,直接提取数据即可。 - 始终使用可选链操作符
?.:避免因设备返回数据结构缺失导致流程崩溃,提升稳定性。
内容的提问来源于stack exchange,提问作者bonito
相关产品推荐
相关产品推荐

