You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.2 KiB
125 lines
3.2 KiB
// ArduinoJson - https://arduinojson.org |
|
// Copyright © 2014-2024, 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/v7/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 |
|
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 issue? |
|
// ------------------ |
|
// |
|
// EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson. |
|
// See: https://arduinojson.org/v7/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 ❤❤❤❤❤
|
|
|