JSON Arduino 中的格式
JSON format in Arduino
如果我直接输入值,我有一个代码可以正常工作,但我当前的系统是这样的,这些值必须改变。请参阅下面的代码。
char http_cmd[] = "POST /tracker/ HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 38\r\nHost: haul1.herokuapp.com\r\n\r\n{ \"trackerId\": \"2222\",\"height\": \"42\" }";
// this works fine
但我想将值作为变量输入,所以我做了这样的事情
String tracker = "2222";
String height = "42";
char http_cmd[] = "POST /tracker/ HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 38\r\nHost: haul1.herokuapp.com\r\n\r\n{ \"trackerId\": \""+tracker+"\",\"height\": \""+height+"\" }";
这是我收到的错误消息
exit status 1
initializer fails to determine size of 'http_cmd'
谢谢 尝试。 我真正需要的是 Json 内容类型的可接受语法,我还需要知道如何获得 "http_cmd"
的确切大小
此时这将被视为字符串连接。 + 运算符将 return 键入 String
而不是 char[]
。您是否尝试过先在单独的变量中创建字符串并对其调用 .c_str()
?
据我所知,如果您跳过所有附加在它之前的 http 内容,json 语法本身看起来不错。
您的代码实际上有两个错误。您看到的错误是因为您创建了一个 char
数组但没有指定长度。还有另一个错误,字符串与 +
的连接是 Arduino 字符串库的一部分,它不是 c++ 的一部分,因此不是数据类型 char
的有效运算符。
有两种方法,1) 使用字符串库中的字符串连接运算符 +
(您只需将代码从 char http_cmd[]
更改为 String http_cmd
); 2)使用字符数组。但通常认为使用 char 数组比使用 String 库更安全。您可以使用 sprintf()
创建字符串数组,这适用于 Arduino 中除浮点数以外的所有数据类型。
为了便于计算json有效负载的长度和可读性,最好将命令分成几个字符串。顺便说一句,我假设 tracker
和 height
实际上是 int
可以直接在 JSON 中编码。
int tracker = 2222;
int height = 42;
// create json payload
char json[30];
sprintf(json, "{\"trackerId\":%d,\"height\":%d}", tracker, height);
char http_post_request[] = "POST /tracker/ HTTP/1.1\r\n";
char http_content_type[] = "Content-Type: application/json\r\n";
// calculate payload length
char http_content_length[20];
sprintf(http_content_length, "Content-Length:%lu\r\n", strlen(json));
char http_host[] = "Host: haul1.herokuapp.com\r\n\r\n";
如果我直接输入值,我有一个代码可以正常工作,但我当前的系统是这样的,这些值必须改变。请参阅下面的代码。
char http_cmd[] = "POST /tracker/ HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 38\r\nHost: haul1.herokuapp.com\r\n\r\n{ \"trackerId\": \"2222\",\"height\": \"42\" }";
// this works fine
但我想将值作为变量输入,所以我做了这样的事情
String tracker = "2222";
String height = "42";
char http_cmd[] = "POST /tracker/ HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 38\r\nHost: haul1.herokuapp.com\r\n\r\n{ \"trackerId\": \""+tracker+"\",\"height\": \""+height+"\" }";
这是我收到的错误消息
exit status 1
initializer fails to determine size of 'http_cmd'
谢谢 尝试。 我真正需要的是 Json 内容类型的可接受语法,我还需要知道如何获得 "http_cmd"
的确切大小此时这将被视为字符串连接。 + 运算符将 return 键入 String
而不是 char[]
。您是否尝试过先在单独的变量中创建字符串并对其调用 .c_str()
?
据我所知,如果您跳过所有附加在它之前的 http 内容,json 语法本身看起来不错。
您的代码实际上有两个错误。您看到的错误是因为您创建了一个 char
数组但没有指定长度。还有另一个错误,字符串与 +
的连接是 Arduino 字符串库的一部分,它不是 c++ 的一部分,因此不是数据类型 char
的有效运算符。
有两种方法,1) 使用字符串库中的字符串连接运算符 +
(您只需将代码从 char http_cmd[]
更改为 String http_cmd
); 2)使用字符数组。但通常认为使用 char 数组比使用 String 库更安全。您可以使用 sprintf()
创建字符串数组,这适用于 Arduino 中除浮点数以外的所有数据类型。
为了便于计算json有效负载的长度和可读性,最好将命令分成几个字符串。顺便说一句,我假设 tracker
和 height
实际上是 int
可以直接在 JSON 中编码。
int tracker = 2222;
int height = 42;
// create json payload
char json[30];
sprintf(json, "{\"trackerId\":%d,\"height\":%d}", tracker, height);
char http_post_request[] = "POST /tracker/ HTTP/1.1\r\n";
char http_content_type[] = "Content-Type: application/json\r\n";
// calculate payload length
char http_content_length[20];
sprintf(http_content_length, "Content-Length:%lu\r\n", strlen(json));
char http_host[] = "Host: haul1.herokuapp.com\r\n\r\n";