串行流上的 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"]
那样 int
,doc["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) {};
}
我正在使用 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"]
那样int
,doc["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) {};
}