串行流上的 arduino json

arduino json on the serial stream

我正在使用 BLuno arduino, 它可以很好地连接到我的 iOS phone,发送和接收消息。

现在我想使用 arduino json 来解析来自 phone,

的消息

串行连接接收数据正常,但我在使用 json 库解析流时做错了...

我收到错误:

deserializeJson() failed: InvalidInput

代码:

#include <ArduinoJson.h>
StaticJsonDocument<400> doc;
void setup() {
Serial.begin(115200); 
}

void loop()
{
  if (Serial.available() > 0)
  {
    String s = Serial.readStringUntil("#");   // Until CR (Carriage Return)
    s.replace("#", "");
    Serial.println(s);

    DeserializationError error = deserializeJson(doc, s);
    if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
   }
  int value = doc["value"];
Serial.println(Serial.println(value));

deserializeJson(doc, s);

正确吗?我尝试从 phone:

发送不同的值

我只需要解析一个键值对,但是 none 以下方法有效:

{'a':'b'}

"{"a":"b"}"

{\"a\":\"b\"}

请问我的问题在哪里? 如何格式化 {"a":"b"}

所以连载喜欢它来解析?

你的代码和ArduinoJson方法都没有问题,

{'a':'b'} "{"a":"b"}" {\"a\":\"b\"}

不是有效的 JSON 对象,也不是 JSON 对象的序列化字符串表示。

如果你JSON由多个对象组成,正确的格式应该是:

[{"a": "b"},{"a": "b"},{"a": "b"}]

并且序列化后的字符串表示应该是这样的:

"[{\"a\": \"b\"},{\"a\": \"b\"},{\"a\": \"b\"}]"

在开发过程中使用其中一个在线 JSON 验证器来验证您的 JSON 对象总是一个好主意。

更新

看起来你已经更新了你的问题,根据你的更新,你的代码中有两个问题:

  • 如果JSON对象是{"a":"b"},那么反序列化后的数据中没有doc["value"],应该是doc["a"]访问值"b".
  • doc["a"] 不会像您的 int value = doc["value"] 那样 intdoc["value"] return 指向 char 的指针。

下面是生成正确值的代码。


void loop() {
  char s[] = "{\"a\":\"b\"}";
  StaticJsonDocument<200> doc;
  DeserializationError error = deserializeJson(doc, s);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }
  const char* value = doc["a"];
  Serial.println(value);
  while(1) {};
}