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

Node-Red中读取设备JSON数据失败的问题求助

解决Node-RED中读取设备JSON数据的问题

问题原因分析

  1. JSON节点报错Unexpected token in JSON at position 0:大概率是HTTP Get请求返回的字符串带有UTF-8字节顺序标记(BOM),或者包含多余空白/非JSON前缀字符,导致JSON解析器无法识别。
  2. 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节点)

  1. 在HTTP节点后加Function节点清理字符串:
// 移除BOM和空白字符
msg.payload = msg.payload.replace(/^\uFEFF/, '').trim();
return msg;
  1. 连接JSON节点(自动将字符串解析为JSON对象)
  2. 再添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:35:21