繁体   English   中英

如何访问 AWS IoT 上 MQTT 消息中的嵌套 JSON 元素?

[英]How do I access nested JSON elements in an MQTT message on AWS IoT?

AWS IoT 规则正在接收以下主题为“TempSensors”的 MQTT 有效负载:

{"message": "{\"sensor\":\"12345\",\"timestamp\":\"2020-01-01 16:00:00\",\"value\":\"[-0.5]\",\"unit\":\"[\"deg. C\"]\"}", "sequence": 1234}

我想为“消息”的每个元素提取键值对,以便可以将以下内容传递给 AWS DynamoDB:

{"sensor":"12345","timestamp":"2020-01-01 16:00:00","value": -0.5,"unit": "deg. C"}

我以为我可以使用点符号访问嵌套元素,例如:

SELECT message.sensor AS sensorid FROM 'TempSensors'

但这会导致:

{}

或者也许抓住一切使用;

SELECT (SELECT * from message) AS data FROM 'TempSensors'

这导致:

{"data":[{"$unknown":"{\"sensor\":\"12345\",\"timestamp\":\"2020-01-01 16:00:00\",\"value\":\"[-0.5]\",\"unit\":\"[\"deg. C\"]\"}"}]}

或者:

SELECT (SELECT sensor FROM message) AS sensorid FROM 'TempSensors'

结果是:

{"sensorid":[{}]}

必须有一种简单的方法来提取我完全丢失的 JSON 数据。 我没看到什么?

您收到的有效负载是一个字符串(JSON 对象),您可以使用ArduinoJson库对其进行反序列化以获取数据。

#include <ArduinoJson.h>

char payload[] = "{\"message\": {\"sensor\":\"12345\",\"timestamp\":\"2020-01-01 16:00:00\",\"value\":[-0.5],\"unit\":[\"deg. C\"]}, \"sequence\": 1234}";

StaticJsonDocument<200> doc;  // change memory allocation based on your payload message size

void setup() {
  Serial.begin(115200);

  DeserializationError error = deserializeJson(doc, payload);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }
  
  // get the sensor info from the deserialised object doc
  const char *sensor = doc["message"]["sensor"];
  double value = doc["message"]["value"][0];
  const char *unit = doc["message"]["unit"][0];
  Serial.printf("Sensor: %s, value: %.1f %s\n", sensor, value, unit);
}

void loop() {

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM