如何在Node-RED函数中解析JSON

时间:2015-10-07 04:29:21

标签: json parsing ibm-cloud node-red

我正在使用Bluemix中的Node-RED进行物联网。

如何解析函数节点中的各条信息(如cmdmsg和tempr),以便我可以在流中的其他节点中使用它? 我尝试时遇到错误(见下文)

当我将其设置为查看完整的消息对象时,我收到了我在“调试”节点中看到的JSON完整消息对象(来自节点中的IoT)。看下面的对象。

在我看来,JSON格式正确。

我尝试将以下内容放在函数节点中,但是我收到一条错误,上面写着“TypeError:无法读取未定义的属性'tempr'”

以下是函数参数: return {payload:msg.payload.d.tempr};

,这是消息对象

{
   "topic": "iot-2/type/Arduino-tempsensor/id/FFFFFFFFFFFF/evt/status/fmt/json", 
   "payload": "{\n\"d\": {\n\"myName\": \"Arduino CF\",\n\"cmdmsg\": \"Weekly\",\n\"tempr\": -3,\n}\n}", 
   "deviceId": "FFFFFFFFFFFF", 
   "deviceType": "Arduino-tempsensor", 
   "eventType": "status", 
   "format": "json", 
   "_msgid": "ffffffff.55555" 
}

注意:我模糊了设备ID(mac地址)和msgid

有关如何解析数据以及我收到错误的原因的任何想法?

2 个答案:

答案 0 :(得分:3)

很抱歉,但您的JSON Payload完全搞砸了,它应该如下所示:{"d": {"myName": "Arduino CF","cmdmsg": "Weekly","tempr": -3}} 您不应该在有效负载中看到任何\\n,它们看起来像客户端的转义字符。我也相信tempr值之后的最后一个逗号不应该是有效的JSON。

我不是Arduino专家,但我已经尝试过Raspberry Pi和Mosquitto客户端,这就是我成功向IoTF发送事件的方法: mosquitto_pub -h <org>.messaging.internetofthings.ibmcloud.com -p 1883 -u "use-token-auth" -P "<token>" -i d:<org>:raspi:raspi2 -t iot-2/evt/message/fmt/json -m {"d":{"text":"Hello World"}}

如果paylod是正确的JSON,您的声明return {payload:msg.payload.d.tempr};将起作用。

你见过这个:http://www.ibm.com/developerworks/cloud/library/cl-bluemix-arduino-iot2/

答案 1 :(得分:0)

在尝试访问其字段之前,您显示的JSON字符串应转换为Javascript对象。要做到这一点就像将arduino输出连接到&#34; JSON&#34; node,为您进行转换(如果字符串有效JSON,则抛出错误。)

如果要查看msg对象的结构,请将JSON节点的输出连接到调试节点。你也可以把它连接到&#34;更改&#34;例如,如果您只想将msg.payload替换为温度值,则节点。您不需要在函数节点中使用任何自定义JavaScript代码来执行此类简单更改。

以下是您可以导入的示例流程...通过将有效负载粘贴到&#34;模板中来模拟arduino输出字符串。节点:

  

[{&#34; ID&#34;:&#34; 1a79abfe.b8abb4&#34;&#34;类型&#34;:&#34;注入&#34;&#34; Z&#34 ;:&#34; 58c8eb7a.5496c4&#34;,&#34; name&#34;:&#34;发送输出&#34;,&#34;主题&#34;:&#34; iot-2 / type / Arduino的tempsensor / ID / FFFFFFFFFFFF / EVT /状态/ FMT / JSON&#34;&#34;有效载荷&#34;:&#34;真&#34;&#34;的payloadType&#34;:&#34 ;布尔&#34;&#34;重复&#34;:&#34;&#34;&#34; crontab的&#34;:&#34;&#34;&#34;一次&#34; :假,&#34; onceDelay&#34;:0.1&#34; X&#34;:170,&#34; Y&#34;:2740,&#34;电线&#34;:[[&#34 ; 9fc678fb.ae18e8&#34;]]},{&#34; ID&#34;:&#34; 69e91778.e0c6e8&#34;&#34;类型&#34;:&#34; JSON&#34 ;, &#34; Z&#34;:&#34; 58c8eb7a.5496c4&#34;&#34;名称&#34;:&#34;&#34;&#34;属性&#34;:&#34有效载荷#34;&#34;动作&#34;:&#34;&#34;&#34;漂亮&#34;:假,&#34; X&#34;:390,&#34; ý&#34;:2800,&#34;电线&#34;:[[&#34; d066800f.60a9b&#34;&#34; cf991eb1.f2a1a&#34;]]},{&#34; ID&# 34;:&#34; 9d8d7da2.2a7da&#34;&#34;类型&#34;:&#34;调试&#34;&#34; Z&#34;:&#34; 58c8eb7a.5496c4&#34 ;,&#34; name&#34;:&#34; msg string&#34;,&#34; active&#34;:true,&#34; tosideba R&#34;:真,&#34;控制台&#34;:假,&#34; tostatus&#34;:假,&#34;完整&#34;:&#34;有效载荷&#34;&#34 ; X&#34;:610,&#34; Y&#34;:2740,&#34;电线&#34;:[]},{&#34; ID&#34;:&#34; 9fc678fb.ae18e8&# 34;,&#34;类型&#34;:&#34;模板&#34;&#34; Z&#34;:&#34; 58c8eb7a.5496c4&#34;&#34;名称&#34 ;: &#34; arduino string&#34;,&#34; field&#34;:&#34; payload&#34;,&#34; fieldType&#34;:&#34; msg&#34;,&#34;格式&#34;:&#34; json&#34;,&#34;语法&#34;:&#34;普通&#34;,&#34;模板&#34;:&#34; {\ n \& #34; d \&#34;:{\ n \&#34; myName \&#34;:\&#34; Arduino CF \&#34;,\ n \&#34; cmdmsg \&#34 ;:&#34;每周\&#34;,\ n \&#34; tempr \&#34;:-3 \ n} \ n}&#34;,&#34;输出&#34;: &#34; STR&#34;&#34; X&#34; 360&#34; Y&#34;:2740,&#34;电线&#34;:[[&#34; 69e91778.e0c6e8&# 34;,&#34; 9d8d7da2.2a7da&#34;]]},{&#34; ID&#34;:&#34; d066800f.60a9b&#34;&#34;类型&#34;:&#34 ;改变&#34;,&#34; z&#34;:&#34; 58c8eb7a.5496c4&#34;,&#34; name&#34;:&#34;提取tempr&#34;,&#34;规则& #34;:[{&#34; T&#34;:&#34;设置&#34;&#34; p&#34;:&#34;有效载荷&#34;&#34; PT&#3 4;:&#34; MSG&#34;&#34;至&#34;:&#34; payload.d.tempr&#34;&#34; TOT&#34;:&#34; MSG&#34 ;}],&#34;动作&#34;:&#34;&#34;&#34;属性&#34;:&#34;&#34;&#34;从&#34;:& #34;&#34;&#34;至&#34;:&#34;&#34;&#34; REG&#34;:假,&#34; X&#34; 450&# 34; Y&#34;:2860,&#34;电线&#34;:[[&#34; af730d72.2995a&#34;]]},{&#34; ID&#34;:&#34; af730d72。 2995a&#34;&#34;类型&#34;:&#34;调试&#34;&#34; Z&#34;:&#34; 58c8eb7a.5496c4&#34;&#34;名称&#34 ;:&#34; tempr&#34;&#34;有源&#34;:真,&#34; tosidebar&#34;:真,&#34;控制台&#34;:假,&#34; tostatus&# 34;:假,&#34;完整&#34;:&#34;真&#34;&#34; X&#34; 630&#34; Y&#34;:2860,&#34;电线& #34;:[]},{&#34; ID&#34;:&#34; cf991eb1.f2a1a&#34;&#34;类型&#34;:&#34;调试&#34;&#34 ; z&#34;:&#34; 58c8eb7a.5496c4&#34;,&#34; name&#34;:&#34; msg object&#34;,&#34; active&#34;:true,&#34 ; tosidebar&#34;:真,&#34;控制台&#34;:假,&#34; tostatus&#34;:假,&#34;完整&#34;:&#34;有效载荷&#34;&# 34; X&#34;:610,&#34; Y&#34;:2800,&#34;电线&#34;:[]}]

正如所指出的那样,你的原始JSON字符串无效,因为尾随逗号 - 但 可以使用双引号和换行符,只要它们使用&#进行转义即可34; \&#34 ;.解析字符串时,无论如何都会将它们删除。

相关问题