Description

This example shows how to parse a JSON document in an HTTP response.

It uses the Ethernet library, but can be easily adapted for WiFi or WiFiClientSecure.

It performs a GET resquest on arduinojson.org/example.json.

Here is the expected response:

{ "sensor": "gps", "time": 1351824120, "data": [ 48.756080, 2.302038 ] } 

This example uses the Stream interface directly. If you prefer using an HTTP library, please see How to use ArduinoJson with HTTPClient?

Source code

#include <ArduinoJson.h> #include <Ethernet.h> #include <SPI.h>  void setup() { // Initialize Serial port Serial.begin(9600); while (!Serial) continue; // Initialize Ethernet library byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; if (!Ethernet.begin(mac)) { Serial.println(F("Failed to configure Ethernet")); return; } delay(1000); Serial.println(F("Connecting...")); // Connect to HTTP server EthernetClient client; client.setTimeout(10000); if (!client.connect("arduinojson.org", 80)) { Serial.println(F("Connection failed")); return; } Serial.println(F("Connected!")); // Send HTTP request client.println(F("GET /example.json HTTP/1.0")); client.println(F("Host: arduinojson.org")); client.println(F("Connection: close")); if (client.println() == 0) { Serial.println(F("Failed to send request")); client.stop(); return; } // Check HTTP status char status[32] = {0}; client.readBytesUntil('\r', status, sizeof(status)); // It should be "HTTP/1.0 200 OK" or "HTTP/1.1 200 OK" if (strcmp(status + 9, "200 OK") != 0) { Serial.print(F("Unexpected response: ")); Serial.println(status); client.stop(); return; } // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!client.find(endOfHeaders)) { Serial.println(F("Invalid response")); client.stop(); return; } // Allocate the JSON document JsonDocument doc; // Parse JSON object DeserializationError error = deserializeJson(doc, client); if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); client.stop(); return; } // Extract values Serial.println(F("Response:")); Serial.println(doc["sensor"].as<const char*>()); Serial.println(doc["time"].as<long>()); Serial.println(doc["data"][0].as<float>(), 6); Serial.println(doc["data"][1].as<float>(), 6); // Disconnect client.stop(); } void loop() { // not used in this example } 

Performance issues? See How to improve deserialization speed?

Things used in this example

Classes

Functions

Libraries

See also

Global warming stripes by Professor Ed Hawkins (University of Reading)