123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- // ArduinoJson - https://arduinojson.org
- // Copyright © 2014-2022, Benoit BLANCHON
- // 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 <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
- // 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<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 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 ❤❤❤❤❤
|