JsonHttpClient.ino
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
- Core
- Ethernet
- Standard C library
See also
- The Reddit case study in the last chapter of Mastering ArduinoJson shows how to use
WiFiClientSecureon ESP8266. - The serialization tutorial shows how to perform an HTTP POST to send a JSON document.
- The example
JsonServer.inoshows how to implement an HTTP server that sends a JSON document in the response. - How to use ArduinoJson with HTTPClient?