Possible ArduinoJson bug on ESP8266? I'm making a small IOT project using the ESP8266 in which I make 2 API calls:


api.openweathermap.org for weather data
api.timezonedb.com


The request logic is the same for both calls, the only difference being how I parse the response string. The first response is parsed fine, while the other isn't.


I print the String responses to Serial, they look fine.
Tried both Dynamic and Static buffers to no avail.
Making the request only to the second API, still not being parsed.
If I make a test and just make the response a String, char[] or char*, it parses fine.


Parsing logic [works]:

StaticJsonBuffer&lt;1000&gt; jsonBuffer;
JsonObject&amp; root = jsonBuffer.parseObject(response);
float raw = root[String("main")][String("temp")].as&lt;float&gt;();


Parsing logic: [does not work]

StaticJsonBuffer&lt;500&gt; jsonBuffer;
JsonObject&amp; root = jsonBuffer.parseObject(response);

String data = root[String("formatted")].as&lt;String&gt;();


The response object looks like this:

{
  "status": "OK",
  "message": "",
  "formatted": "2017-06-30 11:34:13"
}


Request logic:

String RequestAPI::performRequest(String url, char* host){
WiFiClient client;
if (!client.connect(host, port)) {
    lcd -&gt; clearScreen();
    lcd -&gt; drawText("Failed to connect to API", 0, 0, this -&gt; randomUint16());
    delay(5000);
    return "";
}

char endOfHeaders[] = "\r\n\r\n";
client.print(
String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" + 
"Connection: close\r\n\r\n"
);
// Skiping HTTP headers from the response
client.find(endOfHeaders);

unsigned long startTime = millis();
while(client.available() == 0){
    if(millis() - startTime &gt; this -&gt; timeout){
        lcd -&gt; clearScreen();
        lcd -&gt; drawText("API request failed", 0, 0, this -&gt; randomUint16());
        delay(5000);
        return "";
    }
}

String response = "";
while(client.available()){
    response += client.readStringUntil('\r');
}
Serial.println(response);

return response;
}


Now I'm thinking, could the empty message be causing a bug? Or am I doing something wrong?
The issue was caused because of: https://en.wikipedia.org/wiki/Chunked_transfer_encoding

Was not obvious as the data printed to the serial looked completely fine. Fixed with the below code:

client.print(
  String("GET ") + url + " HTTP/1.0\r\n" +
  "Host: " + host + "\r\n" + 
  "Connection: close\r\n\r\n"
);


Dunno why it worked for one API but not the other though.