0

我正在使用 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);
}
4

2 回答 2

0

我已经写了 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);
}
于 2020-05-01T06:59:38.470 回答
0

我有同样的问题并添加.c_str()以获取打印响应。

因此,在您的示例中,它将是:

String a = request->responseText();
Serial.println(a.c_str());

对于 JSON,我还需要添加.c_str()

DynamicJsonDocument jsonDoc(2048);
DeserializeJson(jsonDoc, a.c_str());
于 2020-12-11T17:56:42.750 回答