【问题标题】:How Can I parse out JSON in a Node-RED Function如何在 Node-RED 函数中解析出 JSON
【发布时间】:2015-10-07 04:29:20
【问题描述】:

我正在使用 Bluemix for IoT 中的 Node-RED。

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

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

在我看来,JSON 格式正确。

我尝试将以下内容放在函数节点中,但我收到一条错误消息“TypeError: Cannot read property 'tempr' of undefined”

函数参数如下: 返回 {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

关于如何解析数据以及为什么我收到错误的任何想法?

【问题讨论】:

    标签: json parsing ibm-cloud node-red


    【解决方案1】:

    抱歉,您的 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/

    【讨论】:

    • 感谢您的意见。上面显示的有效负载是当调试节点设置为显示整个消息对象时(我假设它显示了包括换行符等在内的单个格式)。当我更改调试节点以显示有效负载时,我看到: { "d": { "myName": "Arduino CF", "": "CMD", "tempr": -3, } } 看起来几乎像有效的 JSON,除了你提到的 tempr 后面的逗号,我将删除它,看看是否解决了它。
    • 是的,最后的逗号是问题所在。我的浏览器以小字体显示所有内容,尽管那是在临时之后的一段时间。感谢您为我校对我的 JSON!
    【解决方案2】:

    在您尝试访问其字段之前,应将您显示的 JSON 字符串转换为 Javascript 对象。要做到这一点就像将 arduino 输出连接到“JSON”节点一样简单,该节点会为您进行转换(如果字符串是 not 有效的 JSON,则会引发错误)。

    如果您想查看 msg 对象的结构,请将 JSON 节点的输出连接到调试节点。例如,如果您只想将 msg.payload 替换为温度值,您也可以将其连接到“更改”节点。您不需要函数节点中的任何自定义 javascript 代码来执行类似的简单更改。

    这是您可以导入的示例流程...通过将有效负载粘贴到“模板”节点来模拟 arduino 输出字符串:

    [{"id":"1a79abfe.b8abb4","type":"inject","z":"58c​​8eb7a.5496c4","name":"发送输出","topic":"iot-2 /type/Arduino-tempsensor/id/FFFFFFFFFFFF/evt/status/fmt/json","payload":"true","payloadType":"bool","re​​peat":"","crontab":"", "once":false,"onceDelay":0.1,"x":170,"y":2740,"wires":[["9fc678fb.ae18e8"]]},{"id":"69e91778.e0c6e8", "type":"json","z":"58c​​8eb7a.5496c4","name":"","property":"payload","action":"","pretty":false,"x": 390,"y":2800,"wires":[["d066800f.60a9b","cf991eb1.f2a1a"]]},{"id":"9d8d7da2.2a7da","type":"debug","z ":"58c​​8eb7a.5496c4","name":"msg string","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload"," x":610,"y":2740,"wires":[]},{"id":"9fc678fb.ae18e8","type":"template","z":"58c​​8eb7a.5496c4","name ":"arduino string","field":"payload","fieldType":"msg","format":"json","syntax":"plain","template":"{\n \"d \": {\n \"myName\": \"Arduino CF\",\n \"cmdmsg\": \"每周\",\n \"tempr\": -3\n }\n}" ,"输出":"str","x":360,"y":2740, "电线":[["69e91778.e0c6e8","9d8d7da2.2a7da"]]},{"id":"d066800f.60a9b","type":"change","z":"58c​​8eb7a.5496c4", "name":"extract tempr","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.d.tempr" ,"tot":"msg"}],"action":"","property":"","from":"","to":"","re​​g":false,"x":450 ,"y":2860,"wires":[["af730d72.2995a"]]},{"id":"af730d72.2995a","type":"debug","z":"58c​​8eb7a.5496c4" ,"名称":"tempr","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":630,"y" :2860,"wires":[]},{"id":"cf991eb1.f2a1a","type":"debug","z":"58c​​8eb7a.5496c4","name":"msg object","活动":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":610,"y":2800,"wires":[]} ]

    如前所述,您的原始 JSON 字符串无效,因为尾随逗号 - 但只要使用“\ ”。解析字符串时,无论如何都会将其剥离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      相关资源
      最近更新 更多