json - Esp 8266 解析 json 异步
问题描述
我正在使用 asyncHTTPrequest 对 ESP8266 中的 REST API 进行异步请求。我收到 JSON 格式的响应,但无法解析它。
当我曾经对 API 进行同步调用时,这种解析是有效的。
我试图将 request->responseText() 存储到一个字符串变量中,因为它返回一个字符串,但该变量永远不会得到任何值。
void sendRequest() {
if (request.readyState() == 0 || request.readyState() == 4) {
request.open("GET", "http://192.168.1.103:45456/api/systems/1013/arduino");
request.send();
}
}
void requestCB(void* optParm, asyncHTTPrequest* request, int readyState) {
if (readyState == 4) {
Serial.println(request->responseText());
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(2) + JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(8)+816;
DynamicJsonBuffer jsonBuffer(capacity);
JsonObject& root = jsonBuffer.parseObject(request->responseText());
String a = request->responseText();
Serial.println(a);
JsonObject& schState = root["dataForArduino"][0];
String beginTime = schState["start"]; // "2019-12-02T21:51:00"
}
}
void setup() {
Serial.begin(9600);
wifi.Connect();
request.onReadyStateChange(requestCB);
ticker.attach(5, sendRequest);
}
解决方案
我已经写了 json 解析函数(__get_from_json)来从这里的 json 中获取键值
例如,如果您有类似的 json 响应
{
"timestamp" : "2020-04-01 19:20:49"
}
然后在您的应用程序中,您想从中解析时间戳值
char response[max_response_size] = "{ \"timestamp\" : \"2020-04-01 19:20:49\" }";
char key[max_key_size] = "timestamp";
char value[max_value_size] = "";
if( __get_from_json( response, key, value, max_value_size ) ){
Serial.println(value);
}
推荐阅读
- python - 生成向量的幂并以简洁的方式将其放入 numpy 的矩阵中
- android - compileLintOptionsJavaWithJavac 失败,找不到符号
- python-xarray - 在时间维度中子集 xarray 数据集或数据数组
- cpanel - 设置 addondomain 获取“此网站不再存在或从未存在过。”
- asp.net-core - 如何在 .net Core 2.1 RazorPages 中创建确认消息?
- css - Bootstrap 4 图像叠加问题
- google-apps-script - 在 Google 表格中为具有仅查看权限的用户创建弹出消息
- python - Python连接两列但保持固定长度
- python - Python - 插入 ms 访问表
- jquery - Boostrap Datepicker 不显示/