// ArduinoJson - https://arduinojson.org // Copyright Benoit Blanchon 2014-2021 // MIT License // // 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. // // It performs a GET resquest on https://arduinojson.org/example.json // Here is the expected response: // { // "sensor": "gps", // "time": 1351824120, // "data": [ // 48.756080, // 2.302038 // ] // } // // https://arduinojson.org/v6/example/http-client/ #include #include #include 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 // Use https://arduinojson.org/v6/assistant to compute the capacity. const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60; DynamicJsonDocument doc(capacity); // 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()); Serial.println(doc["time"].as()); Serial.println(doc["data"][0].as(), 6); Serial.println(doc["data"][1].as(), 6); // Disconnect client.stop(); } void loop() { // not used in this example } // Performance issue? // ------------------ // // EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson. // See: https://arduinojson.org/v6/how-to/improve-speed/ // See also // -------- // // https://arduinojson.org/ contains the documentation for all the functions // used above. It also includes an FAQ that will help you solve any // serialization problem. // // The book "Mastering ArduinoJson" contains a tutorial on deserialization // showing how to parse the response from GitHub's API. In the last chapter, // it shows how to parse the huge documents from OpenWeatherMap // and Reddit. // Learn more at https://arduinojson.org/book/ // Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤