mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-15 03:26:39 +02:00
Return JsonArray
and JsonObject
by value (closes #309)
This commit is contained in:
30
CHANGELOG.md
30
CHANGELOG.md
@ -1,6 +1,36 @@
|
|||||||
ArduinoJson: change log
|
ArduinoJson: change log
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
HEAD
|
||||||
|
----
|
||||||
|
|
||||||
|
* Return `JsonArray` and `JsonObject` by value instead of reference (issue #309)
|
||||||
|
* Replaced `success()` with `isNull()`
|
||||||
|
|
||||||
|
> ### BREAKING CHANGES
|
||||||
|
>
|
||||||
|
> Old code:
|
||||||
|
>
|
||||||
|
> ```c++
|
||||||
|
> JsonObject& obj = doc.to<JsonObject>();
|
||||||
|
> JsonArray& arr = obj.createNestedArray("key");
|
||||||
|
> if (!arr.success()) {
|
||||||
|
> Serial.println("No enough memory");
|
||||||
|
> return;
|
||||||
|
> }
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> New code:
|
||||||
|
>
|
||||||
|
> ```c++
|
||||||
|
> JsonObject obj = doc.to<JsonObject>();
|
||||||
|
> JsonArray arr = obj.createNestedArray("key");
|
||||||
|
> if (arr.isNull()) {
|
||||||
|
> Serial.println("No enough memory");
|
||||||
|
> return;
|
||||||
|
> }
|
||||||
|
> ```
|
||||||
|
|
||||||
v6.0.1-beta
|
v6.0.1-beta
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302
|
|||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, json);
|
deserializeJson(doc, json);
|
||||||
|
|
||||||
JsonObject& root = doc.as<JsonObject>();
|
JsonObjectRef root = doc.as<JsonObject>();
|
||||||
const char* sensor = root["sensor"];
|
const char* sensor = root["sensor"];
|
||||||
long time = root["time"];
|
long time = root["time"];
|
||||||
double latitude = root["data"][0];
|
double latitude = root["data"][0];
|
||||||
@ -79,11 +79,11 @@ Here is a program that generates a JSON document with ArduinoJson:
|
|||||||
```c++
|
```c++
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
|
|
||||||
JsonObject& root = doc.to<JsonObject>();
|
JsonObject root = doc.to<JsonObject>();
|
||||||
root["sensor"] = "gps";
|
root["sensor"] = "gps";
|
||||||
root["time"] = 1351824120;
|
root["time"] = 1351824120;
|
||||||
|
|
||||||
JsonArray& data = root.createNestedArray("data");
|
JsonArray data = root.createNestedArray("data");
|
||||||
data.add(48.756080);
|
data.add(48.756080);
|
||||||
data.add(2.302038);
|
data.add(2.302038);
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ void loadConfiguration(const char *filename, Config &config) {
|
|||||||
Serial.println(F("Failed to read file, using default configuration"));
|
Serial.println(F("Failed to read file, using default configuration"));
|
||||||
|
|
||||||
// Get the root object in the document
|
// Get the root object in the document
|
||||||
JsonObject &root = doc.as<JsonObject>();
|
JsonObject root = doc.as<JsonObject>();
|
||||||
|
|
||||||
// Copy values from the JsonObject to the Config
|
// Copy values from the JsonObject to the Config
|
||||||
config.port = root["port"] | 2731;
|
config.port = root["port"] | 2731;
|
||||||
@ -70,7 +70,7 @@ void saveConfiguration(const char *filename, const Config &config) {
|
|||||||
StaticJsonDocument<256> doc;
|
StaticJsonDocument<256> doc;
|
||||||
|
|
||||||
// Make our document contain an object
|
// Make our document contain an object
|
||||||
JsonObject &root = doc.to<JsonObject>();
|
JsonObject root = doc.to<JsonObject>();
|
||||||
|
|
||||||
// Set the values in the object
|
// Set the values in the object
|
||||||
root["hostname"] = config.hostname;
|
root["hostname"] = config.hostname;
|
||||||
@ -132,15 +132,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/config/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// serialization or deserialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a case study of a project that has
|
|
||||||
// a complex configuration with nested members.
|
|
||||||
// Contrary to this example, the project in the book uses the SPIFFS filesystem.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -24,7 +24,7 @@ void setup() {
|
|||||||
// DynamicJsonDocument doc(200);
|
// DynamicJsonDocument doc(200);
|
||||||
|
|
||||||
// Make our document be an object
|
// Make our document be an object
|
||||||
JsonObject& root = doc.to<JsonObject>();
|
JsonObject root = doc.to<JsonObject>();
|
||||||
|
|
||||||
// Add values in the object
|
// Add values in the object
|
||||||
//
|
//
|
||||||
@ -35,7 +35,7 @@ void setup() {
|
|||||||
|
|
||||||
// Add an array.
|
// Add an array.
|
||||||
//
|
//
|
||||||
JsonArray& data = root.createNestedArray("data");
|
JsonArray data = root.createNestedArray("data");
|
||||||
data.add(48.756080);
|
data.add(48.756080);
|
||||||
data.add(2.302038);
|
data.add(2.302038);
|
||||||
|
|
||||||
@ -61,15 +61,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/generator/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// serialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
|
|
||||||
// It begins with a simple example, like the one above, and then adds more
|
|
||||||
// features like serializing directly to a file or an HTTP request.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -84,7 +84,7 @@ void setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extract values
|
// Extract values
|
||||||
JsonObject& root = doc.as<JsonObject>();
|
JsonObject root = doc.as<JsonObject>();
|
||||||
Serial.println(F("Response:"));
|
Serial.println(F("Response:"));
|
||||||
Serial.println(root["sensor"].as<char*>());
|
Serial.println(root["sensor"].as<char*>());
|
||||||
Serial.println(root["time"].as<char*>());
|
Serial.println(root["time"].as<char*>());
|
||||||
@ -99,16 +99,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/http-client/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// serialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a tutorial on deserialization
|
|
||||||
// showing how to parse the response from Yahoo Weather. In the last chapter,
|
|
||||||
// it shows how to parse the huge documents from OpenWeatherMap
|
|
||||||
// and Weather Underground.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -42,7 +42,7 @@ void setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the root object in the document
|
// Get the root object in the document
|
||||||
JsonObject& root = doc.as<JsonObject>();
|
JsonObject root = doc.as<JsonObject>();
|
||||||
|
|
||||||
// Fetch values.
|
// Fetch values.
|
||||||
//
|
//
|
||||||
@ -64,15 +64,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/parser/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// deserialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a tutorial on deserialization.
|
|
||||||
// It begins with a simple example, like the one above, and then adds more
|
|
||||||
// features like deserializing directly from a file or an HTTP request.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -56,10 +56,10 @@ void loop() {
|
|||||||
StaticJsonDocument<500> doc;
|
StaticJsonDocument<500> doc;
|
||||||
|
|
||||||
// Make our document represent an object
|
// Make our document represent an object
|
||||||
JsonObject& root = doc.to<JsonObject>();
|
JsonObject root = doc.to<JsonObject>();
|
||||||
|
|
||||||
// Create the "analog" array
|
// Create the "analog" array
|
||||||
JsonArray& analogValues = root.createNestedArray("analog");
|
JsonArray analogValues = root.createNestedArray("analog");
|
||||||
for (int pin = 0; pin < 6; pin++) {
|
for (int pin = 0; pin < 6; pin++) {
|
||||||
// Read the analog input
|
// Read the analog input
|
||||||
int value = analogRead(pin);
|
int value = analogRead(pin);
|
||||||
@ -69,7 +69,7 @@ void loop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the "digital" array
|
// Create the "digital" array
|
||||||
JsonArray& digitalValues = root.createNestedArray("digital");
|
JsonArray digitalValues = root.createNestedArray("digital");
|
||||||
for (int pin = 0; pin < 14; pin++) {
|
for (int pin = 0; pin < 14; pin++) {
|
||||||
// Read the digital input
|
// Read the digital input
|
||||||
int value = digitalRead(pin);
|
int value = digitalRead(pin);
|
||||||
@ -95,15 +95,4 @@ void loop() {
|
|||||||
client.stop();
|
client.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/http-server/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// serialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
|
|
||||||
// It begins with a simple example, then adds more features like serializing
|
|
||||||
// directly to a file or an HTTP client.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -48,10 +48,10 @@ void loop() {
|
|||||||
StaticJsonDocument<500> doc;
|
StaticJsonDocument<500> doc;
|
||||||
|
|
||||||
// Make our document represent an object
|
// Make our document represent an object
|
||||||
JsonObject& root = doc.to<JsonObject>();
|
JsonObject root = doc.to<JsonObject>();
|
||||||
|
|
||||||
// Create the "analog" array
|
// Create the "analog" array
|
||||||
JsonArray& analogValues = root.createNestedArray("analog");
|
JsonArray analogValues = root.createNestedArray("analog");
|
||||||
for (int pin = 0; pin < 6; pin++) {
|
for (int pin = 0; pin < 6; pin++) {
|
||||||
// Read the analog input
|
// Read the analog input
|
||||||
int value = analogRead(pin);
|
int value = analogRead(pin);
|
||||||
@ -61,7 +61,7 @@ void loop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the "digital" array
|
// Create the "digital" array
|
||||||
JsonArray& digitalValues = root.createNestedArray("digital");
|
JsonArray digitalValues = root.createNestedArray("digital");
|
||||||
for (int pin = 0; pin < 14; pin++) {
|
for (int pin = 0; pin < 14; pin++) {
|
||||||
// Read the digital input
|
// Read the digital input
|
||||||
int value = digitalRead(pin);
|
int value = digitalRead(pin);
|
||||||
@ -87,15 +87,4 @@ void loop() {
|
|||||||
delay(10000);
|
delay(10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/udp-beacon/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// serialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
|
|
||||||
// It begins with a simple example, then adds more features like serializing
|
|
||||||
// directly to a file or any stream.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -55,7 +55,7 @@ void setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the root object in the document
|
// Get the root object in the document
|
||||||
JsonObject& root = doc.as<JsonObject>();
|
JsonObject root = doc.as<JsonObject>();
|
||||||
|
|
||||||
// Fetch values.
|
// Fetch values.
|
||||||
//
|
//
|
||||||
@ -77,15 +77,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/msgpack-parser/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any
|
|
||||||
// deserialization problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a tutorial on deserialization.
|
|
||||||
// It begins with a simple example, like the one above, and then adds more
|
|
||||||
// features like deserializing directly from a file or an HTTP request.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -21,7 +21,7 @@ void setup() {
|
|||||||
// JsonBuffer.
|
// JsonBuffer.
|
||||||
deserializeJson(doc, F("{\"sensor\":\"gps\",\"time\":1351824120,"
|
deserializeJson(doc, F("{\"sensor\":\"gps\",\"time\":1351824120,"
|
||||||
"\"data\":[48.756080,2.302038]}"));
|
"\"data\":[48.756080,2.302038]}"));
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
// You can use a Flash String to get an element of a JsonObject
|
// You can use a Flash String to get an element of a JsonObject
|
||||||
// No duplication is done.
|
// No duplication is done.
|
||||||
@ -56,15 +56,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/progmem/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any memory
|
|
||||||
// problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a quick C++ course that explains
|
|
||||||
// how your microcontroller stores strings in memory. It also tells why you
|
|
||||||
// should not abuse Flash strings with ArduinoJson.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -18,7 +18,7 @@ void setup() {
|
|||||||
String input =
|
String input =
|
||||||
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
|
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
|
||||||
deserializeJson(doc, input);
|
deserializeJson(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
// You can use a String to get an element of a JsonObject
|
// You can use a String to get an element of a JsonObject
|
||||||
// No duplication is done.
|
// No duplication is done.
|
||||||
@ -62,14 +62,4 @@ void loop() {
|
|||||||
// not used in this example
|
// not used in this example
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also
|
// Visit https://arduinojson.org/v6/example/string/ for more.
|
||||||
// --------
|
|
||||||
//
|
|
||||||
// The website arduinojson.org contains the documentation for all the functions
|
|
||||||
// used above. It also includes an FAQ that will help you solve any problem.
|
|
||||||
// Please check it out at: https://arduinojson.org/
|
|
||||||
//
|
|
||||||
// The book "Mastering ArduinoJson" contains a quick C++ course that explains
|
|
||||||
// how your microcontroller stores strings in memory. On several occasions, it
|
|
||||||
// shows how you can avoid String in your program.
|
|
||||||
// Please check it out at: https://arduinojson.org/book/
|
|
||||||
|
@ -7,13 +7,20 @@
|
|||||||
#include "ArduinoJson/version.hpp"
|
#include "ArduinoJson/version.hpp"
|
||||||
|
|
||||||
#include "ArduinoJson/DynamicJsonDocument.hpp"
|
#include "ArduinoJson/DynamicJsonDocument.hpp"
|
||||||
|
#include "ArduinoJson/StaticJsonDocument.hpp"
|
||||||
|
|
||||||
|
#include "ArduinoJson/JsonObjectImpl.hpp"
|
||||||
|
|
||||||
|
#include "ArduinoJson/JsonArray.hpp"
|
||||||
|
#include "ArduinoJson/JsonObject.hpp"
|
||||||
|
|
||||||
|
#include "ArduinoJson/JsonArrayImpl.hpp"
|
||||||
|
#include "ArduinoJson/JsonArraySubscript.hpp"
|
||||||
|
#include "ArduinoJson/JsonObjectSubscript.hpp"
|
||||||
|
#include "ArduinoJson/JsonVariantImpl.hpp"
|
||||||
|
|
||||||
#include "ArduinoJson/Json/JsonDeserializer.hpp"
|
#include "ArduinoJson/Json/JsonDeserializer.hpp"
|
||||||
#include "ArduinoJson/Json/JsonSerializer.hpp"
|
#include "ArduinoJson/Json/JsonSerializer.hpp"
|
||||||
#include "ArduinoJson/Json/PrettyJsonSerializer.hpp"
|
#include "ArduinoJson/Json/PrettyJsonSerializer.hpp"
|
||||||
#include "ArduinoJson/MsgPack/MsgPackDeserializer.hpp"
|
#include "ArduinoJson/MsgPack/MsgPackDeserializer.hpp"
|
||||||
#include "ArduinoJson/MsgPack/MsgPackSerializer.hpp"
|
#include "ArduinoJson/MsgPack/MsgPackSerializer.hpp"
|
||||||
#include "ArduinoJson/StaticJsonDocument.hpp"
|
|
||||||
|
|
||||||
#include "ArduinoJson/JsonArrayImpl.hpp"
|
|
||||||
#include "ArduinoJson/JsonObjectImpl.hpp"
|
|
||||||
#include "ArduinoJson/JsonVariantImpl.hpp"
|
|
||||||
|
@ -19,24 +19,5 @@ struct JsonVariantAs<char*> {
|
|||||||
typedef const char* type;
|
typedef const char* type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
} // namespace Internals
|
||||||
struct JsonVariantAs<JsonArray> {
|
} // namespace ArduinoJson
|
||||||
typedef JsonArray& type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct JsonVariantAs<const JsonArray> {
|
|
||||||
typedef const JsonArray& type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct JsonVariantAs<JsonObject> {
|
|
||||||
typedef JsonObject& type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct JsonVariantAs<const JsonObject> {
|
|
||||||
typedef const JsonObject& type;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -8,20 +8,19 @@
|
|||||||
#include "JsonInteger.hpp"
|
#include "JsonInteger.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
// Forward declarations
|
|
||||||
class JsonArray;
|
|
||||||
class JsonObject;
|
|
||||||
|
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
|
// Forward declarations
|
||||||
|
struct JsonArrayData;
|
||||||
|
struct JsonObjectData;
|
||||||
|
|
||||||
// A union that defines the actual content of a JsonVariant.
|
// A union that defines the actual content of a JsonVariant.
|
||||||
// The enum JsonVariantType determines which member is in use.
|
// The enum JsonVariantType determines which member is in use.
|
||||||
union JsonVariantContent {
|
union JsonVariantContent {
|
||||||
JsonFloat asFloat; // used for double and float
|
JsonFloat asFloat; // used for double and float
|
||||||
JsonUInt asInteger; // used for bool, char, short, int and longs
|
JsonUInt asInteger; // used for bool, char, short, int and longs
|
||||||
const char* asString; // asString can be null
|
const char* asString; // asString can be null
|
||||||
JsonArray* asArray; // asArray cannot be null
|
JsonArrayData* asArray; // asArray cannot be null
|
||||||
JsonObject* asObject; // asObject cannot be null
|
JsonObjectData* asObject; // asObject cannot be null
|
||||||
};
|
};
|
||||||
}
|
} // namespace Internals
|
||||||
}
|
} // namespace ArduinoJson
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
class JsonArray;
|
|
||||||
class JsonObject;
|
|
||||||
|
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
|
|
||||||
@ -19,9 +17,9 @@ enum JsonVariantType {
|
|||||||
JSON_BOOLEAN, // JsonVariant stores a bool
|
JSON_BOOLEAN, // JsonVariant stores a bool
|
||||||
JSON_POSITIVE_INTEGER, // JsonVariant stores an JsonUInt
|
JSON_POSITIVE_INTEGER, // JsonVariant stores an JsonUInt
|
||||||
JSON_NEGATIVE_INTEGER, // JsonVariant stores an JsonUInt that must be negated
|
JSON_NEGATIVE_INTEGER, // JsonVariant stores an JsonUInt that must be negated
|
||||||
JSON_ARRAY, // JsonVariant stores a pointer to a JsonArray
|
JSON_ARRAY, // JsonVariant stores a pointer to a JsonArrayData
|
||||||
JSON_OBJECT, // JsonVariant stores a pointer to a JsonObject
|
JSON_OBJECT, // JsonVariant stores a pointer to a JsonObjectData
|
||||||
JSON_FLOAT // JsonVariant stores a JsonFloat
|
JSON_FLOAT // JsonVariant stores a JsonFloat
|
||||||
};
|
};
|
||||||
}
|
} // namespace Internals
|
||||||
}
|
} // namespace ArduinoJson
|
||||||
|
@ -13,7 +13,7 @@ namespace Internals {
|
|||||||
|
|
||||||
// A singly linked list of T.
|
// A singly linked list of T.
|
||||||
// The linked list is composed of ListNode<T>.
|
// The linked list is composed of ListNode<T>.
|
||||||
// It is derived by JsonArray and JsonObject
|
// It is derived by JsonArrayData and JsonObjectData
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class List {
|
class List {
|
||||||
public:
|
public:
|
||||||
@ -22,23 +22,10 @@ class List {
|
|||||||
typedef ListIterator<T> iterator;
|
typedef ListIterator<T> iterator;
|
||||||
typedef ListConstIterator<T> const_iterator;
|
typedef ListConstIterator<T> const_iterator;
|
||||||
|
|
||||||
// Creates an empty List<T> attached to a JsonBuffer.
|
|
||||||
// The JsonBuffer allows to allocate new nodes.
|
|
||||||
// When buffer is NULL, the List is not able to grow and success() returns
|
|
||||||
// false. This is used to identify bad memory allocations and parsing
|
|
||||||
// failures.
|
|
||||||
explicit List(JsonBuffer *buf) : _buffer(buf), _firstNode(NULL) {}
|
explicit List(JsonBuffer *buf) : _buffer(buf), _firstNode(NULL) {}
|
||||||
|
|
||||||
// Returns true if the object is valid
|
|
||||||
// Would return false in the following situation:
|
|
||||||
// - the memory allocation failed (StaticJsonBuffer was too small)
|
|
||||||
// - the JSON parsing failed
|
|
||||||
bool success() const {
|
|
||||||
return _buffer != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the numbers of elements in the list.
|
// Returns the numbers of elements in the list.
|
||||||
// For a JsonObject, it would return the number of key-value pairs
|
// For a JsonObjectData, it would return the number of key-value pairs
|
||||||
size_t size() const {
|
size_t size() const {
|
||||||
size_t nodeCount = 0;
|
size_t nodeCount = 0;
|
||||||
for (node_type *node = _firstNode; node; node = node->next) nodeCount++;
|
for (node_type *node = _firstNode; node; node = node->next) nodeCount++;
|
||||||
@ -87,14 +74,13 @@ class List {
|
|||||||
JsonBuffer &buffer() const {
|
JsonBuffer &buffer() const {
|
||||||
return *_buffer;
|
return *_buffer;
|
||||||
}
|
}
|
||||||
|
JsonBuffer *_buffer; // TODO!!
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void clear() {
|
void clear() {
|
||||||
_firstNode = 0;
|
_firstNode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonBuffer *_buffer;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
node_type *_firstNode;
|
node_type *_firstNode;
|
||||||
};
|
};
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
// ArduinoJson - arduinojson.org
|
|
||||||
// Copyright Benoit Blanchon 2014-2018
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace ArduinoJson {
|
|
||||||
namespace Internals {
|
|
||||||
|
|
||||||
// A type that is meant to be used by reference only (JsonArray and JsonObject)
|
|
||||||
class ReferenceType {
|
|
||||||
public:
|
|
||||||
bool operator==(const ReferenceType& other) const {
|
|
||||||
// two JsonArray are equal if they are the same instance
|
|
||||||
// (we don't compare the content)
|
|
||||||
return this == &other;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const ReferenceType& other) const {
|
|
||||||
return this != &other;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -32,28 +32,26 @@ class DynamicJsonDocument {
|
|||||||
return _root.as<T>();
|
return _root.as<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// JsonObject& to<JsonObject>()
|
// JsonObject to<JsonObject>()
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<Internals::is_same<T, JsonObject>::value,
|
typename Internals::enable_if<Internals::is_same<T, JsonObject>::value,
|
||||||
JsonObject&>::type
|
JsonObject>::type
|
||||||
to() {
|
to() {
|
||||||
clear();
|
clear();
|
||||||
JsonObject* object = new (&_buffer) JsonObject(&_buffer);
|
JsonObject object(&_buffer);
|
||||||
if (!object) return JsonObject::invalid();
|
|
||||||
_root = object;
|
_root = object;
|
||||||
return *object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
// JsonArray& to<JsonArray>()
|
// JsonArray to<JsonArray>()
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<Internals::is_same<T, JsonArray>::value,
|
typename Internals::enable_if<Internals::is_same<T, JsonArray>::value,
|
||||||
JsonArray&>::type
|
JsonArray>::type
|
||||||
to() {
|
to() {
|
||||||
clear();
|
clear();
|
||||||
JsonArray* array = new (&_buffer) JsonArray(&_buffer);
|
JsonArray array(&_buffer);
|
||||||
if (!array) return JsonArray::invalid();
|
|
||||||
_root = array;
|
_root = array;
|
||||||
return *array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
// JsonVariant& to<JsonVariant>()
|
// JsonVariant& to<JsonVariant>()
|
||||||
|
@ -66,8 +66,8 @@ class JsonDeserializer {
|
|||||||
DeserializationError parseArray(JsonVariant &variant) {
|
DeserializationError parseArray(JsonVariant &variant) {
|
||||||
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
||||||
|
|
||||||
JsonArray *array = new (_buffer) JsonArray(_buffer);
|
JsonArray array(_buffer);
|
||||||
if (!array) return DeserializationError::NoMemory;
|
if (array.isNull()) return DeserializationError::NoMemory;
|
||||||
variant = array;
|
variant = array;
|
||||||
|
|
||||||
// Check opening braket
|
// Check opening braket
|
||||||
@ -88,7 +88,7 @@ class JsonDeserializer {
|
|||||||
err = parse(value);
|
err = parse(value);
|
||||||
_nestingLimit++;
|
_nestingLimit++;
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
if (!array->add(value)) return DeserializationError::NoMemory;
|
if (!array.add(value)) return DeserializationError::NoMemory;
|
||||||
|
|
||||||
// 2 - Skip spaces
|
// 2 - Skip spaces
|
||||||
err = skipSpacesAndComments();
|
err = skipSpacesAndComments();
|
||||||
@ -103,8 +103,8 @@ class JsonDeserializer {
|
|||||||
DeserializationError parseObject(JsonVariant &variant) {
|
DeserializationError parseObject(JsonVariant &variant) {
|
||||||
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
||||||
|
|
||||||
JsonObject *object = new (_buffer) JsonObject(_buffer);
|
JsonObject object(_buffer);
|
||||||
if (!object) return DeserializationError::NoMemory;
|
if (object.isNull()) return DeserializationError::NoMemory;
|
||||||
variant = object;
|
variant = object;
|
||||||
|
|
||||||
// Check opening brace
|
// Check opening brace
|
||||||
@ -126,9 +126,7 @@ class JsonDeserializer {
|
|||||||
|
|
||||||
// Skip spaces
|
// Skip spaces
|
||||||
err = skipSpacesAndComments();
|
err = skipSpacesAndComments();
|
||||||
if (err) return err;
|
if (err) return err; // Colon
|
||||||
|
|
||||||
// Colon
|
|
||||||
if (!eat(':')) return DeserializationError::InvalidInput;
|
if (!eat(':')) return DeserializationError::InvalidInput;
|
||||||
|
|
||||||
// Parse value
|
// Parse value
|
||||||
@ -137,7 +135,7 @@ class JsonDeserializer {
|
|||||||
err = parse(value);
|
err = parse(value);
|
||||||
_nestingLimit++;
|
_nestingLimit++;
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
if (!object->set(key, value)) return DeserializationError::NoMemory;
|
if (!object.set(key, value)) return DeserializationError::NoMemory;
|
||||||
|
|
||||||
// Skip spaces
|
// Skip spaces
|
||||||
err = skipSpacesAndComments();
|
err = skipSpacesAndComments();
|
||||||
|
@ -75,7 +75,9 @@ class JsonSerializer {
|
|||||||
_writer.writeBoolean(value);
|
_writer.writeBoolean(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void acceptUndefined() {}
|
void acceptNull() {
|
||||||
|
_writer.writeRaw("null");
|
||||||
|
}
|
||||||
|
|
||||||
size_t bytesWritten() const {
|
size_t bytesWritten() const {
|
||||||
return _writer.bytesWritten();
|
return _writer.bytesWritten();
|
||||||
|
@ -13,13 +13,6 @@
|
|||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
|
|
||||||
// Writes the JSON tokens to a Print implementation
|
|
||||||
// This class is used by:
|
|
||||||
// - JsonArray::writeTo()
|
|
||||||
// - JsonObject::writeTo()
|
|
||||||
// - JsonVariant::writeTo()
|
|
||||||
// Its derived by PrettyJsonWriter that overrides some members to add
|
|
||||||
// indentation.
|
|
||||||
template <typename Print>
|
template <typename Print>
|
||||||
class JsonWriter {
|
class JsonWriter {
|
||||||
public:
|
public:
|
||||||
|
@ -4,91 +4,126 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Data/List.hpp"
|
#include "./JsonArrayData.hpp"
|
||||||
#include "Data/ReferenceType.hpp"
|
|
||||||
#include "Data/ValueSaver.hpp"
|
|
||||||
#include "JsonVariant.hpp"
|
|
||||||
#include "Memory/JsonBufferAllocated.hpp"
|
|
||||||
#include "Polyfills/type_traits.hpp"
|
|
||||||
#include "Strings/StringTraits.hpp"
|
|
||||||
|
|
||||||
// Returns the size (in bytes) of an array with n elements.
|
|
||||||
// Can be very handy to determine the size of a StaticJsonBuffer.
|
|
||||||
#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \
|
|
||||||
(sizeof(JsonArray) + (NUMBER_OF_ELEMENTS) * sizeof(JsonArray::node_type))
|
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
// Forward declarations
|
|
||||||
class JsonObject;
|
class JsonObject;
|
||||||
class JsonBuffer;
|
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
class JsonArraySubscript;
|
class JsonArraySubscript;
|
||||||
}
|
}
|
||||||
|
|
||||||
class JsonArray : public Internals::ReferenceType,
|
class JsonArray {
|
||||||
public Internals::NonCopyable,
|
friend class JsonVariant;
|
||||||
public Internals::List<JsonVariant>,
|
|
||||||
public Internals::JsonBufferAllocated {
|
|
||||||
public:
|
public:
|
||||||
explicit JsonArray(Internals::JsonBuffer *buf) throw()
|
typedef Internals::JsonArrayData::iterator iterator;
|
||||||
: Internals::List<JsonVariant>(buf) {}
|
typedef Internals::JsonArrayData::const_iterator const_iterator;
|
||||||
|
|
||||||
// Gets the value at the specified index
|
JsonArray() : _data(0) {}
|
||||||
const Internals::JsonArraySubscript operator[](size_t index) const;
|
JsonArray(Internals::JsonArrayData* arr) : _data(arr) {}
|
||||||
|
JsonArray(Internals::JsonBuffer* buf)
|
||||||
// Gets or sets the value at specified index
|
: _data(new (buf) Internals::JsonArrayData(buf)) {}
|
||||||
Internals::JsonArraySubscript operator[](size_t index);
|
|
||||||
|
|
||||||
// Adds the specified value at the end of the array.
|
// Adds the specified value at the end of the array.
|
||||||
//
|
//
|
||||||
// bool add(TValue);
|
// bool add(TValue);
|
||||||
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
||||||
// std::string, String, JsonArray, JsonObject
|
// std::string, String, JsonArrayData, JsonObject
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool add(const T &value) {
|
bool add(const T& value) {
|
||||||
return add_impl<const T &>(value);
|
return add_impl<const T&>(value);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool add(TValue);
|
// bool add(TValue);
|
||||||
// TValue = char*, const char*, const FlashStringHelper*
|
// TValue = char*, const char*, const FlashStringHelper*
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool add(T *value) {
|
bool add(T* value) {
|
||||||
return add_impl<T *>(value);
|
return add_impl<T*>(value);
|
||||||
}
|
|
||||||
//
|
|
||||||
// bool add(TValue value, uint8_t decimals);
|
|
||||||
// TValue = float, double
|
|
||||||
template <typename T>
|
|
||||||
DEPRECATED("Second argument is not supported anymore")
|
|
||||||
bool add(T value, uint8_t) {
|
|
||||||
return add_impl<const JsonVariant &>(JsonVariant(value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the value at specified index.
|
iterator begin() {
|
||||||
//
|
if (!_data) return iterator();
|
||||||
// bool add(size_t index, const TValue&);
|
return _data->begin();
|
||||||
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
|
||||||
// std::string, String, JsonArray, JsonObject
|
|
||||||
template <typename T>
|
|
||||||
bool set(size_t index, const T &value) {
|
|
||||||
return set_impl<const T &>(index, value);
|
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// bool add(size_t index, TValue);
|
const_iterator begin() const {
|
||||||
// TValue = char*, const char*, const FlashStringHelper*
|
if (!_data) return const_iterator();
|
||||||
template <typename T>
|
return _data->begin();
|
||||||
bool set(size_t index, T *value) {
|
|
||||||
return set_impl<T *>(index, value);
|
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// bool set(size_t index, TValue value, uint8_t decimals);
|
iterator end() {
|
||||||
// TValue = float, double
|
return iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
const_iterator end() const {
|
||||||
|
return const_iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Imports a 1D array
|
||||||
|
template <typename T, size_t N>
|
||||||
|
bool copyFrom(T (&array)[N]) {
|
||||||
|
return copyFrom(array, N);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Imports a 1D array
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<Internals::is_floating_point<T>::value,
|
bool copyFrom(T* array, size_t len) {
|
||||||
bool>::type
|
bool ok = true;
|
||||||
set(size_t index, T value, uint8_t decimals) {
|
for (size_t i = 0; i < len; i++) {
|
||||||
return set_impl<const JsonVariant &>(index, JsonVariant(value, decimals));
|
ok &= add(array[i]);
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Imports a 2D array
|
||||||
|
template <typename T, size_t N1, size_t N2>
|
||||||
|
bool copyFrom(T (&array)[N1][N2]) {
|
||||||
|
bool ok = true;
|
||||||
|
for (size_t i = 0; i < N1; i++) {
|
||||||
|
JsonArray nestedArray = createNestedArray();
|
||||||
|
for (size_t j = 0; j < N2; j++) {
|
||||||
|
ok &= nestedArray.add(array[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exports a 1D array
|
||||||
|
template <typename T, size_t N>
|
||||||
|
size_t copyTo(T (&array)[N]) const {
|
||||||
|
return copyTo(array, N);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exports a 1D array
|
||||||
|
template <typename T>
|
||||||
|
size_t copyTo(T* array, size_t len) const {
|
||||||
|
size_t i = 0;
|
||||||
|
for (const_iterator it = begin(); it != end() && i < len; ++it)
|
||||||
|
array[i++] = *it;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exports a 2D array
|
||||||
|
template <typename T, size_t N1, size_t N2>
|
||||||
|
void copyTo(T (&array)[N1][N2]) const {
|
||||||
|
if (!_data) return;
|
||||||
|
size_t i = 0;
|
||||||
|
for (const_iterator it = begin(); it != end() && i < N1; ++it) {
|
||||||
|
it->as<JsonArray>().copyTo(array[i++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArray createNestedArray();
|
||||||
|
JsonObject createNestedObject();
|
||||||
|
|
||||||
|
Internals::JsonArraySubscript operator[](size_t index);
|
||||||
|
|
||||||
|
const Internals::JsonArraySubscript operator[](size_t index) const;
|
||||||
|
|
||||||
|
bool operator==(const JsonArray& rhs) const {
|
||||||
|
return _data == rhs._data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the value at the specified index.
|
// Gets the value at the specified index.
|
||||||
@ -105,82 +140,51 @@ class JsonArray : public Internals::ReferenceType,
|
|||||||
return it != end() ? it->is<T>() : false;
|
return it != end() ? it->is<T>() : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a JsonArray and adds a reference at the end of the array.
|
// Removes element at specified position.
|
||||||
JsonArray &createNestedArray();
|
void remove(iterator it) {
|
||||||
|
if (!_data) return;
|
||||||
// Creates a JsonObject and adds a reference at the end of the array.
|
_data->remove(it);
|
||||||
JsonObject &createNestedObject();
|
}
|
||||||
|
|
||||||
// Removes element at specified index.
|
// Removes element at specified index.
|
||||||
void remove(size_t index) {
|
void remove(size_t index) {
|
||||||
remove(begin() += index);
|
remove(begin() += index);
|
||||||
}
|
}
|
||||||
using Internals::List<JsonVariant>::remove;
|
|
||||||
|
|
||||||
// Returns a reference an invalid JsonArray.
|
// Sets the value at specified index.
|
||||||
// This object is meant to replace a NULL pointer.
|
//
|
||||||
// This is used when memory allocation or JSON parsing fail.
|
// bool add(size_t index, const TValue&);
|
||||||
static JsonArray &invalid() {
|
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
||||||
static JsonArray instance(NULL);
|
// std::string, String, JsonArrayData, JsonObject
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Imports a 1D array
|
|
||||||
template <typename T, size_t N>
|
|
||||||
bool copyFrom(T (&array)[N]) {
|
|
||||||
return copyFrom(array, N);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Imports a 1D array
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool copyFrom(T *array, size_t len) {
|
bool set(size_t index, const T& value) {
|
||||||
bool ok = true;
|
if (!_data) return false;
|
||||||
for (size_t i = 0; i < len; i++) {
|
return set_impl<const T&>(index, value);
|
||||||
ok &= add(array[i]);
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
}
|
||||||
|
//
|
||||||
// Imports a 2D array
|
// bool add(size_t index, TValue);
|
||||||
template <typename T, size_t N1, size_t N2>
|
// TValue = char*, const char*, const FlashStringHelper*
|
||||||
bool copyFrom(T (&array)[N1][N2]) {
|
|
||||||
bool ok = true;
|
|
||||||
for (size_t i = 0; i < N1; i++) {
|
|
||||||
JsonArray &nestedArray = createNestedArray();
|
|
||||||
for (size_t j = 0; j < N2; j++) {
|
|
||||||
ok &= nestedArray.add(array[i][j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exports a 1D array
|
|
||||||
template <typename T, size_t N>
|
|
||||||
size_t copyTo(T (&array)[N]) const {
|
|
||||||
return copyTo(array, N);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exports a 1D array
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
size_t copyTo(T *array, size_t len) const {
|
bool set(size_t index, T* value) {
|
||||||
size_t i = 0;
|
if (!_data) return false;
|
||||||
for (const_iterator it = begin(); it != end() && i < len; ++it)
|
return set_impl<T*>(index, value);
|
||||||
array[i++] = *it;
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exports a 2D array
|
size_t size() const {
|
||||||
template <typename T, size_t N1, size_t N2>
|
if (!_data) return 0;
|
||||||
void copyTo(T (&array)[N1][N2]) const {
|
return _data->size();
|
||||||
size_t i = 0;
|
}
|
||||||
for (const_iterator it = begin(); it != end() && i < N1; ++it) {
|
|
||||||
it->as<JsonArray>().copyTo(array[i++]);
|
bool isNull() const {
|
||||||
}
|
return _data == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Visitor>
|
template <typename Visitor>
|
||||||
void visit(Visitor &visitor) const {
|
void visit(Visitor& visitor) const {
|
||||||
return visitor.acceptArray(*this);
|
if (_data)
|
||||||
|
return visitor.acceptArray(*this);
|
||||||
|
else
|
||||||
|
visitor.acceptNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -188,23 +192,17 @@ class JsonArray : public Internals::ReferenceType,
|
|||||||
bool set_impl(size_t index, TValueRef value) {
|
bool set_impl(size_t index, TValueRef value) {
|
||||||
iterator it = begin() += index;
|
iterator it = begin() += index;
|
||||||
if (it == end()) return false;
|
if (it == end()) return false;
|
||||||
return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value);
|
return Internals::ValueSaver<TValueRef>::save(_data->_buffer, *it, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TValueRef>
|
template <typename TValueRef>
|
||||||
bool add_impl(TValueRef value) {
|
bool add_impl(TValueRef value) {
|
||||||
iterator it = Internals::List<JsonVariant>::add();
|
if (!_data) return false;
|
||||||
|
iterator it = _data->add();
|
||||||
if (it == end()) return false;
|
if (it == end()) return false;
|
||||||
return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value);
|
return Internals::ValueSaver<TValueRef>::save(_data->_buffer, *it, value);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
namespace Internals {
|
Internals::JsonArrayData* _data;
|
||||||
template <>
|
|
||||||
struct JsonVariantDefault<JsonArray> {
|
|
||||||
static JsonArray &get() {
|
|
||||||
return JsonArray::invalid();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
} // namespace Internals
|
|
||||||
} // namespace ArduinoJson
|
} // namespace ArduinoJson
|
||||||
|
27
src/ArduinoJson/JsonArrayData.hpp
Normal file
27
src/ArduinoJson/JsonArrayData.hpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// ArduinoJson - arduinojson.org
|
||||||
|
// Copyright Benoit Blanchon 2014-2018
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Data/List.hpp"
|
||||||
|
#include "Data/ValueSaver.hpp"
|
||||||
|
#include "JsonVariant.hpp"
|
||||||
|
#include "Memory/JsonBufferAllocated.hpp"
|
||||||
|
#include "Polyfills/type_traits.hpp"
|
||||||
|
#include "Strings/StringTraits.hpp"
|
||||||
|
|
||||||
|
// Returns the size (in bytes) of an array with n elements.
|
||||||
|
// Can be very handy to determine the size of a StaticJsonBuffer.
|
||||||
|
#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \
|
||||||
|
(sizeof(ArduinoJson::Internals::JsonArrayData) + \
|
||||||
|
(NUMBER_OF_ELEMENTS) * \
|
||||||
|
sizeof(ArduinoJson::Internals::JsonArrayData::node_type))
|
||||||
|
|
||||||
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
struct JsonArrayData : List<JsonVariant>, JsonBufferAllocated {
|
||||||
|
explicit JsonArrayData(JsonBuffer *buf) throw() : List<JsonVariant>(buf) {}
|
||||||
|
};
|
||||||
|
} // namespace Internals
|
||||||
|
} // namespace ArduinoJson
|
@ -5,24 +5,21 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "JsonArray.hpp"
|
#include "JsonArray.hpp"
|
||||||
#include "JsonArraySubscript.hpp"
|
|
||||||
#include "JsonObject.hpp"
|
#include "JsonObject.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
inline JsonArray &JsonArray::createNestedArray() {
|
inline JsonArray JsonArray::createNestedArray() {
|
||||||
JsonArray *array = new (_buffer) JsonArray(_buffer);
|
if (!_data) return JsonArray();
|
||||||
if (!array) return JsonArray::invalid();
|
JsonArray array(_data->_buffer);
|
||||||
|
if (!array.isNull()) add(array);
|
||||||
add(array);
|
return array;
|
||||||
return *array;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline JsonObject &JsonArray::createNestedObject() {
|
inline JsonObject JsonArray::createNestedObject() {
|
||||||
JsonObject *object = new (_buffer) JsonObject(_buffer);
|
if (!_data) return JsonObject();
|
||||||
if (!object) return JsonObject::invalid();
|
JsonObject object(_data->_buffer);
|
||||||
|
if (!object.isNull()) add(object);
|
||||||
add(object);
|
return object;
|
||||||
return *object;
|
|
||||||
}
|
}
|
||||||
} // namespace ArduinoJson
|
} // namespace ArduinoJson
|
||||||
|
@ -16,7 +16,7 @@ namespace ArduinoJson {
|
|||||||
namespace Internals {
|
namespace Internals {
|
||||||
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
||||||
public:
|
public:
|
||||||
FORCE_INLINE JsonArraySubscript(JsonArray& array, size_t index)
|
FORCE_INLINE JsonArraySubscript(JsonArray array, size_t index)
|
||||||
: _array(array), _index(index) {}
|
: _array(array), _index(index) {}
|
||||||
|
|
||||||
FORCE_INLINE JsonArraySubscript& operator=(const JsonArraySubscript& src) {
|
FORCE_INLINE JsonArraySubscript& operator=(const JsonArraySubscript& src) {
|
||||||
@ -43,8 +43,8 @@ class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE bool success() const {
|
FORCE_INLINE bool isNull() const {
|
||||||
return _index < _array.size();
|
return _index >= _array.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -80,7 +80,7 @@ class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JsonArray& _array;
|
JsonArray _array;
|
||||||
const size_t _index;
|
const size_t _index;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) {
|
|||||||
|
|
||||||
inline const Internals::JsonArraySubscript JsonArray::operator[](
|
inline const Internals::JsonArraySubscript JsonArray::operator[](
|
||||||
size_t index) const {
|
size_t index) const {
|
||||||
return Internals::JsonArraySubscript(*const_cast<JsonArray*>(this), index);
|
return Internals::JsonArraySubscript(*this, index);
|
||||||
}
|
}
|
||||||
} // namespace ArduinoJson
|
} // namespace ArduinoJson
|
||||||
|
|
||||||
|
@ -4,110 +4,82 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Data/List.hpp"
|
#include "./JsonObjectData.hpp"
|
||||||
#include "Data/ReferenceType.hpp"
|
|
||||||
#include "Data/ValueSaver.hpp"
|
|
||||||
#include "JsonPair.hpp"
|
|
||||||
#include "Memory/JsonBufferAllocated.hpp"
|
|
||||||
#include "Polyfills/type_traits.hpp"
|
|
||||||
#include "Strings/StringTraits.hpp"
|
|
||||||
|
|
||||||
// Returns the size (in bytes) of an object with n elements.
|
|
||||||
// Can be very handy to determine the size of a StaticJsonBuffer.
|
|
||||||
#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \
|
|
||||||
(sizeof(JsonObject) + (NUMBER_OF_ELEMENTS) * sizeof(JsonObject::node_type))
|
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
// Forward declarations
|
class JsonObject {
|
||||||
class JsonArray;
|
friend class JsonVariant;
|
||||||
class JsonBuffer;
|
|
||||||
namespace Internals {
|
|
||||||
template <typename>
|
|
||||||
class JsonObjectSubscript;
|
|
||||||
}
|
|
||||||
|
|
||||||
class JsonObject : public Internals::ReferenceType,
|
|
||||||
public Internals::NonCopyable,
|
|
||||||
public Internals::List<JsonPair>,
|
|
||||||
public Internals::JsonBufferAllocated {
|
|
||||||
public:
|
public:
|
||||||
// Create an empty JsonArray attached to the specified JsonBuffer.
|
typedef Internals::JsonObjectData::iterator iterator;
|
||||||
// You should not use this constructor directly.
|
typedef Internals::JsonObjectData::const_iterator const_iterator;
|
||||||
explicit JsonObject(Internals::JsonBuffer* buf) throw()
|
|
||||||
: Internals::List<JsonPair>(buf) {}
|
|
||||||
|
|
||||||
// Gets or sets the value associated with the specified key.
|
JsonObject() : _data(0) {}
|
||||||
//
|
JsonObject(Internals::JsonObjectData* object) : _data(object) {}
|
||||||
// JsonObjectSubscript operator[](TKey)
|
JsonObject(Internals::JsonBuffer* buf)
|
||||||
// TKey = const std::string&, const String&
|
: _data(new (buf) Internals::JsonObjectData(buf)) {}
|
||||||
template <typename TString>
|
|
||||||
Internals::JsonObjectSubscript<const TString&> operator[](
|
iterator begin() {
|
||||||
const TString& key) {
|
if (!_data) return iterator();
|
||||||
return Internals::JsonObjectSubscript<const TString&>(*this, key);
|
return _data->begin();
|
||||||
}
|
|
||||||
//
|
|
||||||
// JsonObjectSubscript operator[](TKey)
|
|
||||||
// TKey = char*, const char*, char[], const char[N], const FlashStringHelper*
|
|
||||||
template <typename TString>
|
|
||||||
Internals::JsonObjectSubscript<TString*> operator[](TString* key) {
|
|
||||||
return Internals::JsonObjectSubscript<TString*>(*this, key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the value associated with the specified key.
|
const_iterator begin() const {
|
||||||
//
|
if (!_data) return const_iterator();
|
||||||
// const JsonObjectSubscript operator[](TKey) const;
|
return _data->begin();
|
||||||
// TKey = const std::string&, const String&
|
|
||||||
template <typename TString>
|
|
||||||
const Internals::JsonObjectSubscript<const TString&> operator[](
|
|
||||||
const TString& key) const {
|
|
||||||
return Internals::JsonObjectSubscript<const TString&>(
|
|
||||||
*const_cast<JsonObject*>(this), key);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// const JsonObjectSubscript operator[](TKey) const;
|
|
||||||
// TKey = const char*, const char[N], const FlashStringHelper*
|
|
||||||
template <typename TString>
|
|
||||||
const Internals::JsonObjectSubscript<TString*> operator[](
|
|
||||||
TString* key) const {
|
|
||||||
return Internals::JsonObjectSubscript<TString*>(
|
|
||||||
*const_cast<JsonObject*>(this), key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the specified key with the specified value.
|
// Tells weither the specified key is present and associated with a value.
|
||||||
//
|
//
|
||||||
// bool set(TKey, TValue);
|
// bool containsKey(TKey);
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
template <typename TString>
|
||||||
// std::string, String, JsonArray, JsonObject
|
bool containsKey(const TString& key) const {
|
||||||
template <typename TValue, typename TString>
|
return containsKey_impl<const TString&>(key);
|
||||||
bool set(const TString& key, const TValue& value) {
|
|
||||||
return set_impl<const TString&, const TValue&>(key, value);
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool set(TKey, TValue);
|
// bool containsKey(TKey);
|
||||||
|
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
||||||
|
template <typename TString>
|
||||||
|
bool containsKey(TString* key) const {
|
||||||
|
return containsKey_impl<TString*>(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator end() {
|
||||||
|
return iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
const_iterator end() const {
|
||||||
|
return const_iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates and adds a JsonArray.
|
||||||
|
//
|
||||||
|
// JsonArray createNestedArray(TKey);
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
// TValue = char*, const char*, const FlashStringHelper*
|
template <typename TString>
|
||||||
template <typename TValue, typename TString>
|
JsonArray createNestedArray(const TString& key);
|
||||||
bool set(const TString& key, TValue* value) {
|
// JsonArray createNestedArray(TKey);
|
||||||
return set_impl<const TString&, TValue*>(key, value);
|
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
||||||
|
template <typename TString>
|
||||||
|
JsonArray createNestedArray(TString* key);
|
||||||
|
|
||||||
|
// Creates and adds a JsonObject.
|
||||||
|
//
|
||||||
|
// JsonObject createNestedObject(TKey);
|
||||||
|
// TKey = const std::string&, const String&
|
||||||
|
template <typename TString>
|
||||||
|
JsonObject createNestedObject(const TString& key) {
|
||||||
|
if (!_data) return JsonObject();
|
||||||
|
return createNestedObject_impl<const TString&>(key);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool set(TKey, const TValue&);
|
// JsonObject createNestedObject(TKey);
|
||||||
// TKey = char*, const char*, const FlashStringHelper*
|
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
||||||
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
template <typename TString>
|
||||||
// std::string, String, JsonArray, JsonObject
|
JsonObject createNestedObject(TString* key) {
|
||||||
template <typename TValue, typename TString>
|
return createNestedObject_impl<TString*>(key);
|
||||||
bool set(TString* key, const TValue& value) {
|
|
||||||
return set_impl<TString*, const TValue&>(key, value);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// bool set(TKey, TValue);
|
|
||||||
// TKey = char*, const char*, const FlashStringHelper*
|
|
||||||
// TValue = char*, const char*, const FlashStringHelper*
|
|
||||||
template <typename TValue, typename TString>
|
|
||||||
bool set(TString* key, TValue* value) {
|
|
||||||
return set_impl<TString*, TValue*>(key, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the value associated with the specified key.
|
// Gets the value associated with the specified key.
|
||||||
@ -152,51 +124,48 @@ class JsonObject : public Internals::ReferenceType,
|
|||||||
return is_impl<TString*, TValue>(key);
|
return is_impl<TString*, TValue>(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates and adds a JsonArray.
|
// Gets or sets the value associated with the specified key.
|
||||||
//
|
//
|
||||||
// JsonArray& createNestedArray(TKey);
|
// JsonObjectSubscript operator[](TKey)
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
JsonArray& createNestedArray(const TString& key) {
|
Internals::JsonObjectSubscript<const TString&> operator[](
|
||||||
return createNestedArray_impl<const TString&>(key);
|
const TString& key) {
|
||||||
|
return Internals::JsonObjectSubscript<const TString&>(*this, key);
|
||||||
}
|
}
|
||||||
// JsonArray& createNestedArray(TKey);
|
//
|
||||||
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
// JsonObjectSubscript operator[](TKey)
|
||||||
|
// TKey = char*, const char*, char[], const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
JsonArray& createNestedArray(TString* key) {
|
Internals::JsonObjectSubscript<TString*> operator[](TString* key) {
|
||||||
return createNestedArray_impl<TString*>(key);
|
return Internals::JsonObjectSubscript<TString*>(*this, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates and adds a JsonObject.
|
// Gets the value associated with the specified key.
|
||||||
//
|
//
|
||||||
// JsonObject& createNestedObject(TKey);
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
JsonObject& createNestedObject(const TString& key) {
|
const Internals::JsonObjectSubscript<const TString&> operator[](
|
||||||
return createNestedObject_impl<const TString&>(key);
|
const TString& key) const {
|
||||||
|
return Internals::JsonObjectSubscript<const TString&>(*this, key);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// JsonObject& createNestedObject(TKey);
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
// TKey = const char*, const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
JsonObject& createNestedObject(TString* key) {
|
const Internals::JsonObjectSubscript<TString*> operator[](
|
||||||
return createNestedObject_impl<TString*>(key);
|
TString* key) const {
|
||||||
|
return Internals::JsonObjectSubscript<TString*>(*this, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tells weither the specified key is present and associated with a value.
|
bool operator==(const JsonObject& rhs) const {
|
||||||
//
|
return _data == rhs._data;
|
||||||
// bool containsKey(TKey);
|
|
||||||
// TKey = const std::string&, const String&
|
|
||||||
template <typename TString>
|
|
||||||
bool containsKey(const TString& key) const {
|
|
||||||
return findKey<const TString&>(key) != end();
|
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// bool containsKey(TKey);
|
void remove(iterator it) {
|
||||||
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
if (!_data) return;
|
||||||
template <typename TString>
|
_data->remove(it);
|
||||||
bool containsKey(TString* key) const {
|
|
||||||
return findKey<TString*>(key) != end();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes the specified key and the associated value.
|
// Removes the specified key and the associated value.
|
||||||
@ -205,33 +174,81 @@ class JsonObject : public Internals::ReferenceType,
|
|||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
void remove(const TString& key) {
|
void remove(const TString& key) {
|
||||||
remove(findKey<const TString&>(key));
|
remove_impl<const TString&>(key);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// void remove(TKey);
|
// void remove(TKey);
|
||||||
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
void remove(TString* key) {
|
void remove(TString* key) {
|
||||||
remove(findKey<TString*>(key));
|
remove_impl<TString*>(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets the specified key with the specified value.
|
||||||
|
//
|
||||||
|
// bool set(TKey, TValue);
|
||||||
|
// TKey = const std::string&, const String&
|
||||||
|
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
||||||
|
// std::string, String, JsonArray, JsonObject
|
||||||
|
template <typename TValue, typename TString>
|
||||||
|
bool set(const TString& key, const TValue& value) {
|
||||||
|
return set_impl<const TString&, const TValue&>(key, value);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// void remove(iterator)
|
// bool set(TKey, TValue);
|
||||||
using Internals::List<JsonPair>::remove;
|
// TKey = const std::string&, const String&
|
||||||
|
// TValue = char*, const char*, const FlashStringHelper*
|
||||||
|
template <typename TValue, typename TString>
|
||||||
|
bool set(const TString& key, TValue* value) {
|
||||||
|
return set_impl<const TString&, TValue*>(key, value);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// bool set(TKey, const TValue&);
|
||||||
|
// TKey = char*, const char*, const FlashStringHelper*
|
||||||
|
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
|
||||||
|
// std::string, String, JsonArray, JsonObject
|
||||||
|
template <typename TValue, typename TString>
|
||||||
|
bool set(TString* key, const TValue& value) {
|
||||||
|
return set_impl<TString*, const TValue&>(key, value);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// bool set(TKey, TValue);
|
||||||
|
// TKey = char*, const char*, const FlashStringHelper*
|
||||||
|
// TValue = char*, const char*, const FlashStringHelper*
|
||||||
|
template <typename TValue, typename TString>
|
||||||
|
bool set(TString* key, TValue* value) {
|
||||||
|
return set_impl<TString*, TValue*>(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
// Returns a reference an invalid JsonObject.
|
size_t size() const {
|
||||||
// This object is meant to replace a NULL pointer.
|
if (!_data) return 0;
|
||||||
// This is used when memory allocation or JSON parsing fail.
|
return _data->size();
|
||||||
static JsonObject& invalid() {
|
}
|
||||||
static JsonObject instance(NULL);
|
|
||||||
return instance;
|
bool isNull() const {
|
||||||
|
return _data == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Visitor>
|
template <typename Visitor>
|
||||||
void visit(Visitor& visitor) const {
|
void visit(Visitor& visitor) const {
|
||||||
return visitor.acceptObject(*this);
|
if (_data)
|
||||||
|
visitor.acceptObject(*this);
|
||||||
|
else
|
||||||
|
return visitor.acceptNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
template <typename TStringRef>
|
||||||
|
bool containsKey_impl(TStringRef key) const {
|
||||||
|
return findKey<TStringRef>(key) != end();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TStringRef>
|
||||||
|
JsonArray createNestedArray_impl(TStringRef key);
|
||||||
|
|
||||||
|
template <typename TStringRef>
|
||||||
|
JsonObject createNestedObject_impl(TStringRef key);
|
||||||
|
|
||||||
// Returns the list node that matches the specified key.
|
// Returns the list node that matches the specified key.
|
||||||
template <typename TStringRef>
|
template <typename TStringRef>
|
||||||
iterator findKey(TStringRef key) {
|
iterator findKey(TStringRef key) {
|
||||||
@ -254,26 +271,6 @@ class JsonObject : public Internals::ReferenceType,
|
|||||||
: Internals::JsonVariantDefault<TValue>::get();
|
: Internals::JsonVariantDefault<TValue>::get();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TStringRef, typename TValueRef>
|
|
||||||
bool set_impl(TStringRef key, TValueRef value) {
|
|
||||||
// ignore null key
|
|
||||||
if (Internals::StringTraits<TStringRef>::is_null(key)) return false;
|
|
||||||
|
|
||||||
// search a matching key
|
|
||||||
iterator it = findKey<TStringRef>(key);
|
|
||||||
if (it == end()) {
|
|
||||||
// add the key
|
|
||||||
it = Internals::List<JsonPair>::add();
|
|
||||||
if (it == end()) return false;
|
|
||||||
bool key_ok =
|
|
||||||
Internals::ValueSaver<TStringRef>::save(_buffer, it->key, key);
|
|
||||||
if (!key_ok) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// save the value
|
|
||||||
return Internals::ValueSaver<TValueRef>::save(_buffer, it->value, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TStringRef, typename TValue>
|
template <typename TStringRef, typename TValue>
|
||||||
bool is_impl(TStringRef key) const {
|
bool is_impl(TStringRef key) const {
|
||||||
const_iterator it = findKey<TStringRef>(key);
|
const_iterator it = findKey<TStringRef>(key);
|
||||||
@ -281,18 +278,34 @@ class JsonObject : public Internals::ReferenceType,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TStringRef>
|
template <typename TStringRef>
|
||||||
JsonArray& createNestedArray_impl(TStringRef key);
|
void remove_impl(TStringRef key) {
|
||||||
|
if (!_data) return;
|
||||||
template <typename TStringRef>
|
_data->remove(findKey<TStringRef>(key));
|
||||||
JsonObject& createNestedObject_impl(TStringRef key);
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace Internals {
|
|
||||||
template <>
|
|
||||||
struct JsonVariantDefault<JsonObject> {
|
|
||||||
static JsonObject& get() {
|
|
||||||
return JsonObject::invalid();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TStringRef, typename TValueRef>
|
||||||
|
bool set_impl(TStringRef key, TValueRef value) {
|
||||||
|
if (!_data) return false;
|
||||||
|
|
||||||
|
// ignore null key
|
||||||
|
if (Internals::StringTraits<TStringRef>::is_null(key)) return false;
|
||||||
|
|
||||||
|
// search a matching key
|
||||||
|
iterator it = findKey<TStringRef>(key);
|
||||||
|
if (it == end()) {
|
||||||
|
// add the key
|
||||||
|
it = _data->add();
|
||||||
|
if (it == end()) return false;
|
||||||
|
bool key_ok =
|
||||||
|
Internals::ValueSaver<TStringRef>::save(_data->_buffer, it->key, key);
|
||||||
|
if (!key_ok) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the value
|
||||||
|
return Internals::ValueSaver<TValueRef>::save(_data->_buffer, it->value,
|
||||||
|
value);
|
||||||
|
}
|
||||||
|
|
||||||
|
Internals::JsonObjectData* _data;
|
||||||
};
|
};
|
||||||
} // namespace Internals
|
|
||||||
} // namespace ArduinoJson
|
} // namespace ArduinoJson
|
||||||
|
27
src/ArduinoJson/JsonObjectData.hpp
Normal file
27
src/ArduinoJson/JsonObjectData.hpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// ArduinoJson - arduinojson.org
|
||||||
|
// Copyright Benoit Blanchon 2014-2018
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Data/List.hpp"
|
||||||
|
#include "Data/ValueSaver.hpp"
|
||||||
|
#include "JsonPair.hpp"
|
||||||
|
#include "Memory/JsonBufferAllocated.hpp"
|
||||||
|
#include "Polyfills/type_traits.hpp"
|
||||||
|
#include "Strings/StringTraits.hpp"
|
||||||
|
|
||||||
|
// Returns the size (in bytes) of an object with n elements.
|
||||||
|
// Can be very handy to determine the size of a StaticJsonBuffer.
|
||||||
|
#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \
|
||||||
|
(sizeof(ArduinoJson::Internals::JsonObjectData) + \
|
||||||
|
(NUMBER_OF_ELEMENTS) * \
|
||||||
|
sizeof(ArduinoJson::Internals::JsonObjectData::node_type))
|
||||||
|
|
||||||
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
struct JsonObjectData : List<JsonPair>, JsonBufferAllocated {
|
||||||
|
explicit JsonObjectData(JsonBuffer* buf) throw() : List<JsonPair>(buf) {}
|
||||||
|
};
|
||||||
|
} // namespace Internals
|
||||||
|
} // namespace ArduinoJson
|
@ -6,23 +6,32 @@
|
|||||||
|
|
||||||
#include "JsonArray.hpp"
|
#include "JsonArray.hpp"
|
||||||
#include "JsonObject.hpp"
|
#include "JsonObject.hpp"
|
||||||
#include "JsonObjectSubscript.hpp"
|
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
template <typename TStringRef>
|
template <typename TString>
|
||||||
inline JsonArray &JsonObject::createNestedArray_impl(TStringRef key) {
|
inline JsonArray JsonObject::createNestedArray(const TString& key) {
|
||||||
JsonArray *array = new (_buffer) JsonArray(_buffer);
|
return createNestedArray_impl<const TString&>(key);
|
||||||
if (!array) return JsonArray::invalid();
|
}
|
||||||
set(key, array);
|
|
||||||
return *array;
|
template <typename TString>
|
||||||
|
inline JsonArray JsonObject::createNestedArray(TString* key) {
|
||||||
|
return createNestedArray_impl<TString*>(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TStringRef>
|
template <typename TStringRef>
|
||||||
inline JsonObject &JsonObject::createNestedObject_impl(TStringRef key) {
|
inline JsonArray JsonObject::createNestedArray_impl(TStringRef key) {
|
||||||
JsonObject *object = new (_buffer) JsonObject(_buffer);
|
if (!_data) return JsonArray();
|
||||||
if (!object) return JsonObject::invalid();
|
JsonArray array(_data->_buffer);
|
||||||
set(key, object);
|
if (!array.isNull()) set(key, array);
|
||||||
return *object;
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TStringRef>
|
||||||
|
inline JsonObject JsonObject::createNestedObject_impl(TStringRef key) {
|
||||||
|
if (!_data) return JsonObject();
|
||||||
|
JsonObject object(_data->_buffer);
|
||||||
|
if (!object.isNull()) set(key, object);
|
||||||
|
return object;
|
||||||
}
|
}
|
||||||
} // namespace ArduinoJson
|
} // namespace ArduinoJson
|
||||||
|
@ -22,10 +22,10 @@ class JsonObjectSubscript
|
|||||||
typedef JsonObjectSubscript<TStringRef> this_type;
|
typedef JsonObjectSubscript<TStringRef> this_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FORCE_INLINE JsonObjectSubscript(JsonObject& object, TStringRef key)
|
FORCE_INLINE JsonObjectSubscript(JsonObject object, TStringRef key)
|
||||||
: _object(object), _key(key) {}
|
: _object(object), _key(key) {}
|
||||||
|
|
||||||
FORCE_INLINE this_type& operator=(const this_type& src) {
|
FORCE_INLINE this_type &operator=(const this_type &src) {
|
||||||
_object.set(_key, src);
|
_object.set(_key, src);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -36,8 +36,8 @@ class JsonObjectSubscript
|
|||||||
// TValue = bool, char, long, int, short, float, double,
|
// TValue = bool, char, long, int, short, float, double,
|
||||||
// std::string, String, JsonArray, JsonObject
|
// std::string, String, JsonArray, JsonObject
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE typename enable_if<!is_array<TValue>::value, this_type&>::type
|
FORCE_INLINE typename enable_if<!is_array<TValue>::value, this_type &>::type
|
||||||
operator=(const TValue& src) {
|
operator=(const TValue &src) {
|
||||||
_object.set(_key, src);
|
_object.set(_key, src);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -45,13 +45,13 @@ class JsonObjectSubscript
|
|||||||
// operator=(TValue);
|
// operator=(TValue);
|
||||||
// TValue = char*, const char*, const FlashStringHelper*
|
// TValue = char*, const char*, const FlashStringHelper*
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE this_type& operator=(TValue* src) {
|
FORCE_INLINE this_type &operator=(TValue *src) {
|
||||||
_object.set(_key, src);
|
_object.set(_key, src);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE bool success() const {
|
FORCE_INLINE bool isNull() const {
|
||||||
return _object.containsKey(_key);
|
return !_object.containsKey(_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
@ -71,26 +71,59 @@ class JsonObjectSubscript
|
|||||||
// std::string, String, JsonArray, JsonObject
|
// std::string, String, JsonArray, JsonObject
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE typename enable_if<!is_array<TValue>::value, bool>::type set(
|
FORCE_INLINE typename enable_if<!is_array<TValue>::value, bool>::type set(
|
||||||
const TValue& value) {
|
const TValue &value) {
|
||||||
return _object.set(_key, value);
|
return _object.set(_key, value);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool set(TValue);
|
// bool set(TValue);
|
||||||
// TValue = char*, const char, const FlashStringHelper*
|
// TValue = char*, const char, const FlashStringHelper*
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE bool set(const TValue* value) {
|
FORCE_INLINE bool set(const TValue *value) {
|
||||||
return _object.set(_key, value);
|
return _object.set(_key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Visitor>
|
template <typename Visitor>
|
||||||
void visit(Visitor& visitor) const {
|
void visit(Visitor &visitor) const {
|
||||||
return _object.get<JsonVariant>(_key).visit(visitor);
|
return _object.get<JsonVariant>(_key).visit(visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JsonObject& _object;
|
JsonObject _object;
|
||||||
TStringRef _key;
|
TStringRef _key;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename TImpl>
|
||||||
|
template <typename TString>
|
||||||
|
inline typename enable_if<StringTraits<TString>::has_equals,
|
||||||
|
const JsonObjectSubscript<const TString &> >::type
|
||||||
|
JsonVariantSubscripts<TImpl>::operator[](const TString &key) const {
|
||||||
|
return impl()->template as<JsonObject>()[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TImpl>
|
||||||
|
template <typename TString>
|
||||||
|
inline typename enable_if<StringTraits<TString>::has_equals,
|
||||||
|
JsonObjectSubscript<const TString &> >::type
|
||||||
|
JsonVariantSubscripts<TImpl>::operator[](const TString &key) {
|
||||||
|
return impl()->template as<JsonObject>()[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TImpl>
|
||||||
|
template <typename TString>
|
||||||
|
inline typename enable_if<StringTraits<const TString *>::has_equals,
|
||||||
|
JsonObjectSubscript<const TString *> >::type
|
||||||
|
JsonVariantSubscripts<TImpl>::operator[](const TString *key) {
|
||||||
|
return impl()->template as<JsonObject>()[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TImpl>
|
||||||
|
template <typename TString>
|
||||||
|
inline typename enable_if<StringTraits<TString *>::has_equals,
|
||||||
|
const JsonObjectSubscript<const TString *> >::type
|
||||||
|
JsonVariantSubscripts<TImpl>::operator[](const TString *key) const {
|
||||||
|
return impl()->template as<JsonObject>()[key];
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Internals
|
} // namespace Internals
|
||||||
} // namespace ArduinoJson
|
} // namespace ArduinoJson
|
||||||
|
|
||||||
|
@ -8,9 +8,9 @@
|
|||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
// A key value pair for JsonObject.
|
// A key value pair for JsonObjectData.
|
||||||
struct JsonPair {
|
struct JsonPair {
|
||||||
const char* key;
|
const char* key;
|
||||||
JsonVariant value;
|
JsonVariant value;
|
||||||
};
|
};
|
||||||
}
|
} // namespace ArduinoJson
|
||||||
|
@ -104,25 +104,8 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
|
|||||||
_content.asString = value;
|
_content.asString = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a JsonVariant containing a reference to an array.
|
JsonVariant(JsonArray array);
|
||||||
// CAUTION: we are lying about constness, because the array can be modified if
|
JsonVariant(JsonObject object);
|
||||||
// the variant is converted back to a JsonArray&
|
|
||||||
JsonVariant(const JsonArray &array);
|
|
||||||
|
|
||||||
// Create a JsonVariant containing a reference to an object.
|
|
||||||
// CAUTION: we are lying about constness, because the object can be modified
|
|
||||||
// if the variant is converted back to a JsonObject&
|
|
||||||
JsonVariant(const JsonObject &object);
|
|
||||||
|
|
||||||
JsonVariant(JsonArray *array) {
|
|
||||||
_content.asArray = array;
|
|
||||||
_type = Internals::JSON_ARRAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonVariant(JsonObject *object) {
|
|
||||||
_content.asObject = object;
|
|
||||||
_type = Internals::JSON_OBJECT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the variant as the specified type.
|
// Get the variant as the specified type.
|
||||||
//
|
//
|
||||||
@ -179,48 +162,23 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// JsonArray& as<JsonArray> const;
|
// JsonArray as<JsonArray>() const;
|
||||||
// JsonArray& as<JsonArray&> const;
|
// const JsonArray as<const JsonArray>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<
|
typename Internals::enable_if<
|
||||||
Internals::is_same<typename Internals::remove_reference<T>::type,
|
Internals::is_same<typename Internals::remove_const<T>::type,
|
||||||
JsonArray>::value,
|
JsonArray>::value,
|
||||||
JsonArray &>::type
|
JsonArray>::type
|
||||||
as() const {
|
as() const;
|
||||||
return variantAsArray();
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// const JsonArray& as<const JsonArray&> const;
|
// JsonObject as<JsonObject>() const;
|
||||||
|
// const JsonObject as<const JsonObject>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<
|
typename Internals::enable_if<
|
||||||
Internals::is_same<typename Internals::remove_reference<T>::type,
|
Internals::is_same<typename Internals::remove_const<T>::type,
|
||||||
const JsonArray>::value,
|
|
||||||
const JsonArray &>::type
|
|
||||||
as() const {
|
|
||||||
return variantAsArray();
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// JsonObject& as<JsonObject> const;
|
|
||||||
// JsonObject& as<JsonObject&> const;
|
|
||||||
template <typename T>
|
|
||||||
typename Internals::enable_if<
|
|
||||||
Internals::is_same<typename Internals::remove_reference<T>::type,
|
|
||||||
JsonObject>::value,
|
JsonObject>::value,
|
||||||
JsonObject &>::type
|
T>::type
|
||||||
as() const {
|
as() const;
|
||||||
return variantAsObject();
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// JsonObject& as<const JsonObject> const;
|
|
||||||
// JsonObject& as<const JsonObject&> const;
|
|
||||||
template <typename T>
|
|
||||||
typename Internals::enable_if<
|
|
||||||
Internals::is_same<typename Internals::remove_reference<T>::type,
|
|
||||||
const JsonObject>::value,
|
|
||||||
const JsonObject &>::type
|
|
||||||
as() const {
|
|
||||||
return variantAsObject();
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// JsonVariant as<JsonVariant> const;
|
// JsonVariant as<JsonVariant> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -275,36 +233,30 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
|
|||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool is<JsonArray> const;
|
// bool is<JsonArray> const;
|
||||||
// bool is<JsonArray&> const;
|
// bool is<const JsonArray> const;
|
||||||
// bool is<const JsonArray&> const;
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<
|
typename Internals::enable_if<
|
||||||
Internals::is_same<
|
Internals::is_same<typename Internals::remove_const<T>::type,
|
||||||
typename Internals::remove_const<
|
JsonArray>::value,
|
||||||
typename Internals::remove_reference<T>::type>::type,
|
|
||||||
JsonArray>::value,
|
|
||||||
bool>::type
|
bool>::type
|
||||||
is() const {
|
is() const {
|
||||||
return variantIsArray();
|
return variantIsArray();
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool is<JsonObject> const;
|
// bool is<JsonObject> const;
|
||||||
// bool is<JsonObject&> const;
|
// bool is<const JsonObject> const;
|
||||||
// bool is<const JsonObject&> const;
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<
|
typename Internals::enable_if<
|
||||||
Internals::is_same<
|
Internals::is_same<typename Internals::remove_const<T>::type,
|
||||||
typename Internals::remove_const<
|
JsonObject>::value,
|
||||||
typename Internals::remove_reference<T>::type>::type,
|
|
||||||
JsonObject>::value,
|
|
||||||
bool>::type
|
bool>::type
|
||||||
is() const {
|
is() const {
|
||||||
return variantIsObject();
|
return variantIsObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if the variant has a value
|
// Returns true if the variant has a value
|
||||||
bool success() const {
|
bool isNull() const {
|
||||||
return _type != Internals::JSON_UNDEFINED;
|
return _type == Internals::JSON_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Visitor>
|
template <typename Visitor>
|
||||||
@ -315,10 +267,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
|
|||||||
return visitor.acceptFloat(_content.asFloat);
|
return visitor.acceptFloat(_content.asFloat);
|
||||||
|
|
||||||
case JSON_ARRAY:
|
case JSON_ARRAY:
|
||||||
return visitor.acceptArray(*_content.asArray);
|
return visitor.acceptArray(_content.asArray);
|
||||||
|
|
||||||
case JSON_OBJECT:
|
case JSON_OBJECT:
|
||||||
return visitor.acceptObject(*_content.asObject);
|
return visitor.acceptObject(_content.asObject);
|
||||||
|
|
||||||
case JSON_STRING:
|
case JSON_STRING:
|
||||||
return visitor.acceptString(_content.asString);
|
return visitor.acceptString(_content.asString);
|
||||||
@ -336,13 +288,13 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
|
|||||||
return visitor.acceptBoolean(_content.asInteger != 0);
|
return visitor.acceptBoolean(_content.asInteger != 0);
|
||||||
|
|
||||||
default: // JSON_UNDEFINED
|
default: // JSON_UNDEFINED
|
||||||
return visitor.acceptUndefined();
|
return visitor.acceptNull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JsonArray &variantAsArray() const;
|
JsonArray variantAsArray() const;
|
||||||
JsonObject &variantAsObject() const;
|
JsonObject variantAsObject() const;
|
||||||
const char *variantAsString() const;
|
const char *variantAsString() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T variantAsFloat() const;
|
T variantAsFloat() const;
|
||||||
|
@ -13,21 +13,6 @@ namespace Internals {
|
|||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
class JsonVariantCasts {
|
class JsonVariantCasts {
|
||||||
public:
|
public:
|
||||||
// Gets the variant as an array.
|
|
||||||
// Returns a reference to the JsonArray or JsonArray::invalid() if the
|
|
||||||
// variant
|
|
||||||
// is not an array.
|
|
||||||
FORCE_INLINE operator JsonArray &() const {
|
|
||||||
return impl()->template as<JsonArray &>();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets the variant as an object.
|
|
||||||
// Returns a reference to the JsonObject or JsonObject::invalid() if the
|
|
||||||
// variant is not an object.
|
|
||||||
FORCE_INLINE operator JsonObject &() const {
|
|
||||||
return impl()->template as<JsonObject &>();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
FORCE_INLINE operator T() const {
|
FORCE_INLINE operator T() const {
|
||||||
return impl()->template as<T>();
|
return impl()->template as<T>();
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
#include "Strings/StringTraits.hpp"
|
#include "Strings/StringTraits.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
class JsonArray;
|
||||||
|
class JsonObject;
|
||||||
|
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
|
|
||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Configuration.hpp"
|
#include "Configuration.hpp"
|
||||||
#include "JsonArray.hpp"
|
#include "JsonArrayData.hpp"
|
||||||
#include "JsonObject.hpp"
|
#include "JsonObjectData.hpp"
|
||||||
#include "JsonVariant.hpp"
|
#include "JsonVariant.hpp"
|
||||||
#include "Numbers/isFloat.hpp"
|
#include "Numbers/isFloat.hpp"
|
||||||
#include "Numbers/isInteger.hpp"
|
#include "Numbers/isInteger.hpp"
|
||||||
@ -17,32 +17,50 @@
|
|||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
inline JsonVariant::JsonVariant(const JsonArray &array) {
|
inline JsonVariant::JsonVariant(JsonArray array) {
|
||||||
if (array.success()) {
|
if (!array.isNull()) {
|
||||||
_type = Internals::JSON_ARRAY;
|
_type = Internals::JSON_ARRAY;
|
||||||
_content.asArray = const_cast<JsonArray *>(&array);
|
_content.asArray = array._data;
|
||||||
} else {
|
} else {
|
||||||
_type = Internals::JSON_UNDEFINED;
|
_type = Internals::JSON_UNDEFINED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline JsonVariant::JsonVariant(const JsonObject &object) {
|
inline JsonVariant::JsonVariant(JsonObject object) {
|
||||||
if (object.success()) {
|
if (!object.isNull()) {
|
||||||
_type = Internals::JSON_OBJECT;
|
_type = Internals::JSON_OBJECT;
|
||||||
_content.asObject = const_cast<JsonObject *>(&object);
|
_content.asObject = object._data;
|
||||||
} else {
|
} else {
|
||||||
_type = Internals::JSON_UNDEFINED;
|
_type = Internals::JSON_UNDEFINED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline JsonArray &JsonVariant::variantAsArray() const {
|
template <typename T>
|
||||||
if (_type == Internals::JSON_ARRAY) return *_content.asArray;
|
inline typename Internals::enable_if<
|
||||||
return JsonArray::invalid();
|
Internals::is_same<typename Internals::remove_const<T>::type,
|
||||||
|
JsonArray>::value,
|
||||||
|
JsonArray>::type
|
||||||
|
JsonVariant::as() const {
|
||||||
|
return variantAsArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline JsonObject &JsonVariant::variantAsObject() const {
|
template <typename T>
|
||||||
if (_type == Internals::JSON_OBJECT) return *_content.asObject;
|
inline typename Internals::enable_if<
|
||||||
return JsonObject::invalid();
|
Internals::is_same<typename Internals::remove_const<T>::type,
|
||||||
|
JsonObject>::value,
|
||||||
|
T>::type
|
||||||
|
JsonVariant::as() const {
|
||||||
|
return variantAsObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline JsonArray JsonVariant::variantAsArray() const {
|
||||||
|
if (_type == Internals::JSON_ARRAY) return _content.asArray;
|
||||||
|
return JsonArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline JsonObject JsonVariant::variantAsObject() const {
|
||||||
|
if (_type == Internals::JSON_OBJECT) return _content.asObject;
|
||||||
|
return JsonObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include "Strings/StringTraits.hpp"
|
#include "Strings/StringTraits.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
class JsonArray;
|
||||||
|
class JsonObject;
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
|
|
||||||
// Forward declarations.
|
// Forward declarations.
|
||||||
@ -30,14 +32,12 @@ class JsonVariantSubscripts {
|
|||||||
|
|
||||||
// Mimics an array.
|
// Mimics an array.
|
||||||
// Returns the element at specified index if the variant is an array.
|
// Returns the element at specified index if the variant is an array.
|
||||||
// Returns JsonVariant::invalid() if the variant is not an array.
|
|
||||||
FORCE_INLINE const JsonArraySubscript operator[](size_t index) const;
|
FORCE_INLINE const JsonArraySubscript operator[](size_t index) const;
|
||||||
FORCE_INLINE JsonArraySubscript operator[](size_t index);
|
FORCE_INLINE JsonArraySubscript operator[](size_t index);
|
||||||
|
|
||||||
// Mimics an object.
|
// Mimics an object.
|
||||||
// Returns the value associated with the specified key if the variant is
|
// Returns the value associated with the specified key if the variant is
|
||||||
// an object.
|
// an object.
|
||||||
// Return JsonVariant::invalid() if the variant is not an object.
|
|
||||||
//
|
//
|
||||||
// const JsonObjectSubscript operator[](TKey) const;
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
@ -45,27 +45,21 @@ class JsonVariantSubscripts {
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename enable_if<StringTraits<TString>::has_equals,
|
typename enable_if<StringTraits<TString>::has_equals,
|
||||||
const JsonObjectSubscript<const TString &> >::type
|
const JsonObjectSubscript<const TString &> >::type
|
||||||
operator[](const TString &key) const {
|
operator[](const TString &key) const;
|
||||||
return impl()->template as<JsonObject>()[key];
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// const JsonObjectSubscript operator[](TKey) const;
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename enable_if<StringTraits<TString>::has_equals,
|
FORCE_INLINE typename enable_if<StringTraits<TString>::has_equals,
|
||||||
JsonObjectSubscript<const TString &> >::type
|
JsonObjectSubscript<const TString &> >::type
|
||||||
operator[](const TString &key) {
|
operator[](const TString &key);
|
||||||
return impl()->template as<JsonObject>()[key];
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// JsonObjectSubscript operator[](TKey);
|
// JsonObjectSubscript operator[](TKey);
|
||||||
// TKey = const char*, const char[N], const FlashStringHelper*
|
// TKey = const char*, const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename enable_if<StringTraits<const TString *>::has_equals,
|
FORCE_INLINE typename enable_if<StringTraits<const TString *>::has_equals,
|
||||||
JsonObjectSubscript<const TString *> >::type
|
JsonObjectSubscript<const TString *> >::type
|
||||||
operator[](const TString *key) {
|
operator[](const TString *key);
|
||||||
return impl()->template as<JsonObject>()[key];
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// JsonObjectSubscript operator[](TKey);
|
// JsonObjectSubscript operator[](TKey);
|
||||||
// TKey = const char*, const char[N], const FlashStringHelper*
|
// TKey = const char*, const char[N], const FlashStringHelper*
|
||||||
@ -73,9 +67,7 @@ class JsonVariantSubscripts {
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename enable_if<StringTraits<TString *>::has_equals,
|
typename enable_if<StringTraits<TString *>::has_equals,
|
||||||
const JsonObjectSubscript<const TString *> >::type
|
const JsonObjectSubscript<const TString *> >::type
|
||||||
operator[](const TString *key) const {
|
operator[](const TString *key) const;
|
||||||
return impl()->template as<JsonObject>()[key];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const TImpl *impl() const {
|
const TImpl *impl() const {
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "../Configuration.hpp"
|
#include "../Configuration.hpp"
|
||||||
#include "../Polyfills/NonCopyable.hpp"
|
|
||||||
#include "../Polyfills/attributes.hpp"
|
#include "../Polyfills/attributes.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
@ -17,7 +16,7 @@ namespace Internals {
|
|||||||
// Handle the memory management (done in derived classes) and calls the parser.
|
// Handle the memory management (done in derived classes) and calls the parser.
|
||||||
// This abstract class is implemented by StaticJsonBuffer which implements a
|
// This abstract class is implemented by StaticJsonBuffer which implements a
|
||||||
// fixed memory allocation.
|
// fixed memory allocation.
|
||||||
class JsonBuffer : NonCopyable {
|
class JsonBuffer {
|
||||||
public:
|
public:
|
||||||
// Allocates n bytes in the JsonBuffer.
|
// Allocates n bytes in the JsonBuffer.
|
||||||
// Return a pointer to the allocated memory or NULL if allocation fails.
|
// Return a pointer to the allocated memory or NULL if allocation fails.
|
||||||
|
@ -240,13 +240,13 @@ class MsgPackDeserializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DeserializationError readArray(JsonVariant &variant, size_t n) {
|
DeserializationError readArray(JsonVariant &variant, size_t n) {
|
||||||
JsonArray *array = new (_buffer) JsonArray(_buffer);
|
JsonArray array(_buffer);
|
||||||
if (!array) return DeserializationError::NoMemory;
|
if (array.isNull()) return DeserializationError::NoMemory;
|
||||||
variant = array;
|
variant = array;
|
||||||
return readArray(*array, n);
|
return readArray(array, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeserializationError readArray(JsonArray &array, size_t n) {
|
DeserializationError readArray(JsonArray array, size_t n) {
|
||||||
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
||||||
--_nestingLimit;
|
--_nestingLimit;
|
||||||
for (; n; --n) {
|
for (; n; --n) {
|
||||||
@ -267,13 +267,13 @@ class MsgPackDeserializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DeserializationError readObject(JsonVariant &variant, size_t n) {
|
DeserializationError readObject(JsonVariant &variant, size_t n) {
|
||||||
JsonObject *object = new (_buffer) JsonObject(_buffer);
|
JsonObject object(_buffer);
|
||||||
if (!object) return DeserializationError::NoMemory;
|
if (object.isNull()) return DeserializationError::NoMemory;
|
||||||
variant = object;
|
variant = object;
|
||||||
return readObject(*object, n);
|
return readObject(object, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeserializationError readObject(JsonObject &object, size_t n) {
|
DeserializationError readObject(JsonObject object, size_t n) {
|
||||||
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
if (_nestingLimit == 0) return DeserializationError::TooDeep;
|
||||||
--_nestingLimit;
|
--_nestingLimit;
|
||||||
for (; n; --n) {
|
for (; n; --n) {
|
||||||
|
@ -140,7 +140,7 @@ class MsgPackSerializer {
|
|||||||
writeByte(value ? 0xC3 : 0xC2);
|
writeByte(value ? 0xC3 : 0xC2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void acceptUndefined() {
|
void acceptNull() {
|
||||||
writeByte(0xC0);
|
writeByte(0xC0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
// ArduinoJson - arduinojson.org
|
|
||||||
// Copyright Benoit Blanchon 2014-2018
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace ArduinoJson {
|
|
||||||
namespace Internals {
|
|
||||||
|
|
||||||
// A type that cannot be copied
|
|
||||||
class NonCopyable {
|
|
||||||
protected:
|
|
||||||
NonCopyable() {}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// copy constructor is private
|
|
||||||
NonCopyable(const NonCopyable&);
|
|
||||||
|
|
||||||
// copy operator is private
|
|
||||||
NonCopyable& operator=(const NonCopyable&);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -33,28 +33,26 @@ class StaticJsonDocument {
|
|||||||
return _root.as<T>();
|
return _root.as<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// JsonObject& to<JsonObject>()
|
// JsonObject to<JsonObject>()
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<Internals::is_same<T, JsonObject>::value,
|
typename Internals::enable_if<Internals::is_same<T, JsonObject>::value,
|
||||||
JsonObject&>::type
|
JsonObject>::type
|
||||||
to() {
|
to() {
|
||||||
clear();
|
clear();
|
||||||
JsonObject* object = new (&_buffer) JsonObject(&_buffer);
|
JsonObject object(&_buffer);
|
||||||
if (!object) return JsonObject::invalid();
|
|
||||||
_root = object;
|
_root = object;
|
||||||
return *object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
// JsonArray& to<JsonArray>()
|
// JsonArray to<JsonArray>()
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename Internals::enable_if<Internals::is_same<T, JsonArray>::value,
|
typename Internals::enable_if<Internals::is_same<T, JsonArray>::value,
|
||||||
JsonArray&>::type
|
JsonArray>::type
|
||||||
to() {
|
to() {
|
||||||
clear();
|
clear();
|
||||||
JsonArray* array = new (&_buffer) JsonArray(&_buffer);
|
JsonArray array(&_buffer);
|
||||||
if (!array) return JsonArray::invalid();
|
|
||||||
_root = array;
|
_root = array;
|
||||||
return *array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
// JsonVariant to<JsonVariant>()
|
// JsonVariant to<JsonVariant>()
|
||||||
|
@ -20,7 +20,7 @@ TEST_CASE("Gbathree") {
|
|||||||
"\"measlights\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,"
|
"\"measlights\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,"
|
||||||
"15,15]],\"measlights2\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],"
|
"15,15]],\"measlights2\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],"
|
||||||
"[15,15,15,15]],\"altc\":[2,2,2,2],\"altd\":[2,2,2,2]}");
|
"[15,15,15,15]],\"altc\":[2,2,2,2],\"altd\":[2,2,2,2]}");
|
||||||
JsonObject& root = doc.as<JsonObject>();
|
JsonObject root = doc.as<JsonObject>();
|
||||||
|
|
||||||
SECTION("Success") {
|
SECTION("Success") {
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
@ -81,8 +81,8 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Pulses") {
|
SECTION("Pulses") {
|
||||||
// "pulses":[50,50,50]
|
// "pulses":[50,50,50]
|
||||||
|
|
||||||
JsonArray& array = root["pulses"];
|
JsonArray array = root["pulses"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
|
|
||||||
REQUIRE(3 == array.size());
|
REQUIRE(3 == array.size());
|
||||||
|
|
||||||
@ -94,8 +94,8 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Act") {
|
SECTION("Act") {
|
||||||
// "act":[2,1,2,2]
|
// "act":[2,1,2,2]
|
||||||
|
|
||||||
JsonArray& array = root["act"];
|
JsonArray array = root["act"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
|
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
REQUIRE(2 == array[0]);
|
REQUIRE(2 == array[0]);
|
||||||
@ -107,12 +107,12 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Detectors") {
|
SECTION("Detectors") {
|
||||||
// "detectors":[[34,34,34,34],[34,34,34,34],[34,34,34,34],[34,34,34,34]]
|
// "detectors":[[34,34,34,34],[34,34,34,34],[34,34,34,34],[34,34,34,34]]
|
||||||
|
|
||||||
JsonArray& array = root["detectors"];
|
JsonArray array = root["detectors"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; i++) {
|
for (size_t i = 0; i < 4; i++) {
|
||||||
JsonArray& nestedArray = array[i];
|
JsonArray nestedArray = array[i];
|
||||||
REQUIRE(4 == nestedArray.size());
|
REQUIRE(4 == nestedArray.size());
|
||||||
|
|
||||||
for (size_t j = 0; j < 4; j++) {
|
for (size_t j = 0; j < 4; j++) {
|
||||||
@ -124,8 +124,8 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Alta") {
|
SECTION("Alta") {
|
||||||
// alta:[2,2,2,2]
|
// alta:[2,2,2,2]
|
||||||
|
|
||||||
JsonArray& array = root["alta"];
|
JsonArray array = root["alta"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
|
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
@ -137,8 +137,8 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Altb") {
|
SECTION("Altb") {
|
||||||
// altb:[2,2,2,2]
|
// altb:[2,2,2,2]
|
||||||
|
|
||||||
JsonArray& array = root["altb"];
|
JsonArray array = root["altb"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
|
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
@ -150,12 +150,12 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Measlights") {
|
SECTION("Measlights") {
|
||||||
// "measlights":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]
|
// "measlights":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]
|
||||||
|
|
||||||
JsonArray& array = root["measlights"];
|
JsonArray array = root["measlights"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; i++) {
|
for (size_t i = 0; i < 4; i++) {
|
||||||
JsonArray& nestedArray = array[i];
|
JsonArray nestedArray = array[i];
|
||||||
|
|
||||||
REQUIRE(4 == nestedArray.size());
|
REQUIRE(4 == nestedArray.size());
|
||||||
|
|
||||||
@ -168,12 +168,12 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Measlights2") {
|
SECTION("Measlights2") {
|
||||||
// "measlights2":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]
|
// "measlights2":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]
|
||||||
|
|
||||||
JsonArray& array = root["measlights2"];
|
JsonArray array = root["measlights2"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; i++) {
|
for (size_t i = 0; i < 4; i++) {
|
||||||
JsonArray& nestedArray = array[i];
|
JsonArray nestedArray = array[i];
|
||||||
REQUIRE(4 == nestedArray.size());
|
REQUIRE(4 == nestedArray.size());
|
||||||
|
|
||||||
for (size_t j = 0; j < 4; j++) {
|
for (size_t j = 0; j < 4; j++) {
|
||||||
@ -185,8 +185,8 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Altc") {
|
SECTION("Altc") {
|
||||||
// altc:[2,2,2,2]
|
// altc:[2,2,2,2]
|
||||||
|
|
||||||
JsonArray& array = root["altc"];
|
JsonArray array = root["altc"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
|
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
@ -198,8 +198,8 @@ TEST_CASE("Gbathree") {
|
|||||||
SECTION("Altd") {
|
SECTION("Altd") {
|
||||||
// altd:[2,2,2,2]
|
// altd:[2,2,2,2]
|
||||||
|
|
||||||
JsonArray& array = root["altd"];
|
JsonArray array = root["altd"];
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
|
|
||||||
REQUIRE(4 == array.size());
|
REQUIRE(4 == array.size());
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonArray::add()") {
|
TEST_CASE("JsonArray::add()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& _array = doc.to<JsonArray>();
|
JsonArray _array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("int") {
|
SECTION("int") {
|
||||||
_array.add(123);
|
_array.add(123);
|
||||||
@ -40,30 +40,30 @@ TEST_CASE("JsonArray::add()") {
|
|||||||
|
|
||||||
SECTION("nested array") {
|
SECTION("nested array") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
|
|
||||||
_array.add(arr);
|
_array.add(arr);
|
||||||
|
|
||||||
REQUIRE(&arr == &_array[0].as<JsonArray&>());
|
REQUIRE(arr == _array[0].as<JsonArray>());
|
||||||
REQUIRE(_array[0].is<JsonArray&>());
|
REQUIRE(_array[0].is<JsonArray>());
|
||||||
REQUIRE_FALSE(_array[0].is<int>());
|
REQUIRE_FALSE(_array[0].is<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nested object") {
|
SECTION("nested object") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj = doc2.to<JsonObject>();
|
JsonObject obj = doc2.to<JsonObject>();
|
||||||
|
|
||||||
_array.add(obj);
|
_array.add(obj);
|
||||||
|
|
||||||
REQUIRE(&obj == &_array[0].as<JsonObject&>());
|
REQUIRE(obj == _array[0].as<JsonObject>());
|
||||||
REQUIRE(_array[0].is<JsonObject&>());
|
REQUIRE(_array[0].is<JsonObject>());
|
||||||
REQUIRE_FALSE(_array[0].is<int>());
|
REQUIRE_FALSE(_array[0].is<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array subscript") {
|
SECTION("array subscript") {
|
||||||
const char* str = "hello";
|
const char* str = "hello";
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
arr.add(str);
|
arr.add(str);
|
||||||
|
|
||||||
_array.add(arr[0]);
|
_array.add(arr[0]);
|
||||||
@ -74,7 +74,7 @@ TEST_CASE("JsonArray::add()") {
|
|||||||
SECTION("object subscript") {
|
SECTION("object subscript") {
|
||||||
const char* str = "hello";
|
const char* str = "hello";
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj = doc2.to<JsonObject>();
|
JsonObject obj = doc2.to<JsonObject>();
|
||||||
obj["x"] = str;
|
obj["x"] = str;
|
||||||
|
|
||||||
_array.add(obj["x"]);
|
_array.add(obj["x"]);
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonArray basics") {
|
TEST_CASE("JsonArray basics") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("SuccessIsTrue") {
|
SECTION("isNull()") {
|
||||||
REQUIRE(array.success());
|
REQUIRE(array.isNull() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("InitialSizeIsZero") {
|
SECTION("InitialSizeIsZero") {
|
||||||
@ -18,12 +18,12 @@ TEST_CASE("JsonArray basics") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("CreateNestedArray") {
|
SECTION("CreateNestedArray") {
|
||||||
JsonArray& arr = array.createNestedArray();
|
JsonArray arr = array.createNestedArray();
|
||||||
REQUIRE(&arr == &array[0].as<JsonArray&>());
|
REQUIRE(arr == array[0].as<JsonArray>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("CreateNestedObject") {
|
SECTION("CreateNestedObject") {
|
||||||
JsonObject& obj = array.createNestedObject();
|
JsonObject obj = array.createNestedObject();
|
||||||
REQUIRE(&obj == &array[0].as<JsonObject&>());
|
REQUIRE(obj == array[0].as<JsonObject>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
TEST_CASE("JsonArray::copyFrom()") {
|
TEST_CASE("JsonArray::copyFrom()") {
|
||||||
SECTION("OneDimension") {
|
SECTION("OneDimension") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
char json[32];
|
char json[32];
|
||||||
int source[] = {1, 2, 3};
|
int source[] = {1, 2, 3};
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ TEST_CASE("JsonArray::copyFrom()") {
|
|||||||
SECTION("OneDimension_JsonBufferTooSmall") {
|
SECTION("OneDimension_JsonBufferTooSmall") {
|
||||||
const size_t SIZE = JSON_ARRAY_SIZE(2);
|
const size_t SIZE = JSON_ARRAY_SIZE(2);
|
||||||
StaticJsonDocument<SIZE> doc;
|
StaticJsonDocument<SIZE> doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
char json[32];
|
char json[32];
|
||||||
int source[] = {1, 2, 3};
|
int source[] = {1, 2, 3};
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ TEST_CASE("JsonArray::copyFrom()") {
|
|||||||
|
|
||||||
SECTION("TwoDimensions") {
|
SECTION("TwoDimensions") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
char json[32];
|
char json[32];
|
||||||
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
|
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ TEST_CASE("JsonArray::copyFrom()") {
|
|||||||
const size_t SIZE =
|
const size_t SIZE =
|
||||||
JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(2);
|
JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(2);
|
||||||
StaticJsonDocument<SIZE> doc;
|
StaticJsonDocument<SIZE> doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
char json[32];
|
char json[32];
|
||||||
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
|
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ TEST_CASE("JsonArray::copyTo()") {
|
|||||||
char json[] = "[1,2,3]";
|
char json[] = "[1,2,3]";
|
||||||
DeserializationError err = deserializeJson(doc, json);
|
DeserializationError err = deserializeJson(doc, json);
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
int destination[4] = {0};
|
int destination[4] = {0};
|
||||||
size_t result = array.copyTo(destination);
|
size_t result = array.copyTo(destination);
|
||||||
@ -28,7 +28,7 @@ TEST_CASE("JsonArray::copyTo()") {
|
|||||||
char json[] = "[1,2,3]";
|
char json[] = "[1,2,3]";
|
||||||
DeserializationError err = deserializeJson(doc, json);
|
DeserializationError err = deserializeJson(doc, json);
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
int destination[2] = {0};
|
int destination[2] = {0};
|
||||||
size_t result = array.copyTo(destination);
|
size_t result = array.copyTo(destination);
|
||||||
@ -43,7 +43,7 @@ TEST_CASE("JsonArray::copyTo()") {
|
|||||||
|
|
||||||
DeserializationError err = deserializeJson(doc, json);
|
DeserializationError err = deserializeJson(doc, json);
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
int destination[3][2] = {{0}};
|
int destination[3][2] = {{0}};
|
||||||
array.copyTo(destination);
|
array.copyTo(destination);
|
||||||
|
@ -7,28 +7,29 @@
|
|||||||
|
|
||||||
using namespace Catch::Matchers;
|
using namespace Catch::Matchers;
|
||||||
|
|
||||||
TEST_CASE("JsonArray::invalid()") {
|
TEST_CASE("Undefined JsonArray") {
|
||||||
|
JsonArray array;
|
||||||
|
|
||||||
SECTION("SubscriptFails") {
|
SECTION("SubscriptFails") {
|
||||||
REQUIRE_FALSE(JsonArray::invalid()[0].success());
|
REQUIRE(array[0].isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AddFails") {
|
SECTION("AddFails") {
|
||||||
JsonArray& array = JsonArray::invalid();
|
|
||||||
array.add(1);
|
array.add(1);
|
||||||
REQUIRE(0 == array.size());
|
REQUIRE(0 == array.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("CreateNestedArrayFails") {
|
SECTION("CreateNestedArrayFails") {
|
||||||
REQUIRE_FALSE(JsonArray::invalid().createNestedArray().success());
|
REQUIRE(array.createNestedArray().isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("CreateNestedObjectFails") {
|
SECTION("CreateNestedObjectFails") {
|
||||||
REQUIRE_FALSE(JsonArray::invalid().createNestedObject().success());
|
REQUIRE(array.createNestedObject().isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("PrintToWritesBrackets") {
|
SECTION("PrintToWritesBrackets") {
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
serializeJson(JsonArray::invalid(), buffer, sizeof(buffer));
|
serializeJson(array, buffer, sizeof(buffer));
|
||||||
REQUIRE_THAT(buffer, Equals("[]"));
|
REQUIRE_THAT(buffer, Equals("null"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
template <typename TIterator>
|
template <typename TIterator>
|
||||||
static void run_iterator_test() {
|
static void run_iterator_test() {
|
||||||
StaticJsonDocument<JSON_ARRAY_SIZE(2)> doc;
|
StaticJsonDocument<JSON_ARRAY_SIZE(2)> doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
array.add(12);
|
array.add(12);
|
||||||
array.add(34);
|
array.add(34);
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonArray::remove()") {
|
TEST_CASE("JsonArray::remove()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& _array = doc.to<JsonArray>();
|
JsonArray _array = doc.to<JsonArray>();
|
||||||
_array.add(1);
|
_array.add(1);
|
||||||
_array.add(2);
|
_array.add(2);
|
||||||
_array.add(3);
|
_array.add(3);
|
||||||
|
@ -9,7 +9,7 @@ using namespace Catch::Matchers;
|
|||||||
|
|
||||||
TEST_CASE("JsonArray::set()") {
|
TEST_CASE("JsonArray::set()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& _array = doc.to<JsonArray>();
|
JsonArray _array = doc.to<JsonArray>();
|
||||||
_array.add(0);
|
_array.add(0);
|
||||||
|
|
||||||
SECTION("int") {
|
SECTION("int") {
|
||||||
@ -42,29 +42,29 @@ TEST_CASE("JsonArray::set()") {
|
|||||||
|
|
||||||
SECTION("nested array") {
|
SECTION("nested array") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
|
|
||||||
_array.set(0, arr);
|
_array.set(0, arr);
|
||||||
|
|
||||||
REQUIRE(&arr == &_array[0].as<JsonArray&>());
|
REQUIRE(arr == _array[0].as<JsonArray>());
|
||||||
REQUIRE(_array[0].is<JsonArray&>());
|
REQUIRE(_array[0].is<JsonArray>());
|
||||||
REQUIRE_FALSE(_array[0].is<int>());
|
REQUIRE_FALSE(_array[0].is<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nested object") {
|
SECTION("nested object") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj = doc2.to<JsonObject>();
|
JsonObject obj = doc2.to<JsonObject>();
|
||||||
|
|
||||||
_array.set(0, obj);
|
_array.set(0, obj);
|
||||||
|
|
||||||
REQUIRE(&obj == &_array[0].as<JsonObject&>());
|
REQUIRE(obj == _array[0].as<JsonObject>());
|
||||||
REQUIRE(_array[0].is<JsonObject&>());
|
REQUIRE(_array[0].is<JsonObject>());
|
||||||
REQUIRE_FALSE(_array[0].is<int>());
|
REQUIRE_FALSE(_array[0].is<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array subscript") {
|
SECTION("array subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
|
|
||||||
_array.set(0, arr[0]);
|
_array.set(0, arr[0]);
|
||||||
@ -74,7 +74,7 @@ TEST_CASE("JsonArray::set()") {
|
|||||||
|
|
||||||
SECTION("object subscript") {
|
SECTION("object subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj = doc2.to<JsonObject>();
|
JsonObject obj = doc2.to<JsonObject>();
|
||||||
obj["x"] = "hello";
|
obj["x"] = "hello";
|
||||||
|
|
||||||
_array.set(0, obj["x"]);
|
_array.set(0, obj["x"]);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonArray::size()") {
|
TEST_CASE("JsonArray::size()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& _array = doc.to<JsonArray>();
|
JsonArray _array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("increases after add()") {
|
SECTION("increases after add()") {
|
||||||
_array.add("hello");
|
_array.add("hello");
|
||||||
|
@ -12,7 +12,7 @@ static void eraseString(std::string &str) {
|
|||||||
|
|
||||||
TEST_CASE("std::string") {
|
TEST_CASE("std::string") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray &array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("add()") {
|
SECTION("add()") {
|
||||||
std::string value("hello");
|
std::string value("hello");
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonArray::operator[]") {
|
TEST_CASE("JsonArray::operator[]") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& _array = doc.to<JsonArray>();
|
JsonArray _array = doc.to<JsonArray>();
|
||||||
_array.add(0);
|
_array.add(0);
|
||||||
|
|
||||||
SECTION("int") {
|
SECTION("int") {
|
||||||
@ -53,35 +53,33 @@ TEST_CASE("JsonArray::operator[]") {
|
|||||||
|
|
||||||
SECTION("nested array") {
|
SECTION("nested array") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
|
|
||||||
_array[0] = arr;
|
_array[0] = arr;
|
||||||
|
|
||||||
REQUIRE(&arr == &_array[0].as<JsonArray&>());
|
REQUIRE(arr == _array[0].as<JsonArray>());
|
||||||
REQUIRE(&arr == &_array[0].as<JsonArray>()); // <- short hand
|
REQUIRE(arr == _array[0].as<JsonArray>()); // <- short hand
|
||||||
REQUIRE(&arr == &_array[0].as<const JsonArray&>());
|
// REQUIRE(arr == _array[0].as<const JsonArray>());
|
||||||
REQUIRE(&arr == &_array[0].as<const JsonArray>()); // <- short hand
|
// REQUIRE(arr == _array[0].as<const JsonArray>()); // <- short hand
|
||||||
REQUIRE(true == _array[0].is<JsonArray&>());
|
REQUIRE(true == _array[0].is<JsonArray>());
|
||||||
REQUIRE(false == _array[0].is<int>());
|
REQUIRE(false == _array[0].is<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nested object") {
|
SECTION("nested object") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj = doc2.to<JsonObject>();
|
JsonObject obj = doc2.to<JsonObject>();
|
||||||
|
|
||||||
_array[0] = obj;
|
_array[0] = obj;
|
||||||
|
|
||||||
REQUIRE(&obj == &_array[0].as<JsonObject&>());
|
REQUIRE(obj == _array[0].as<JsonObject>());
|
||||||
REQUIRE(&obj == &_array[0].as<JsonObject>()); // <- short hand
|
REQUIRE(obj == _array[0].as<const JsonObject>()); // <- short hand
|
||||||
REQUIRE(&obj == &_array[0].as<const JsonObject&>());
|
REQUIRE(true == _array[0].is<JsonObject>());
|
||||||
REQUIRE(&obj == &_array[0].as<const JsonObject>()); // <- short hand
|
|
||||||
REQUIRE(true == _array[0].is<JsonObject&>());
|
|
||||||
REQUIRE(false == _array[0].is<int>());
|
REQUIRE(false == _array[0].is<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array subscript") {
|
SECTION("array subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
const char* str = "hello";
|
const char* str = "hello";
|
||||||
|
|
||||||
arr.add(str);
|
arr.add(str);
|
||||||
@ -94,7 +92,7 @@ TEST_CASE("JsonArray::operator[]") {
|
|||||||
SECTION("object subscript") {
|
SECTION("object subscript") {
|
||||||
const char* str = "hello";
|
const char* str = "hello";
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj = doc2.to<JsonObject>();
|
JsonObject obj = doc2.to<JsonObject>();
|
||||||
|
|
||||||
obj["x"] = str;
|
obj["x"] = str;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("An empty array") {
|
SECTION("An empty array") {
|
||||||
DeserializationError err = deserializeJson(doc, "[]");
|
DeserializationError err = deserializeJson(doc, "[]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(0 == arr.size());
|
REQUIRE(0 == arr.size());
|
||||||
@ -19,7 +19,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Spaces") {
|
SECTION("Spaces") {
|
||||||
SECTION("Before the opening bracket") {
|
SECTION("Before the opening bracket") {
|
||||||
DeserializationError err = deserializeJson(doc, " []");
|
DeserializationError err = deserializeJson(doc, " []");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(0 == arr.size());
|
REQUIRE(0 == arr.size());
|
||||||
@ -27,7 +27,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Before first value") {
|
SECTION("Before first value") {
|
||||||
DeserializationError err = deserializeJson(doc, "[ \t\r\n42]");
|
DeserializationError err = deserializeJson(doc, "[ \t\r\n42]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -36,7 +36,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("After first value") {
|
SECTION("After first value") {
|
||||||
DeserializationError err = deserializeJson(doc, "[42 \t\r\n]");
|
DeserializationError err = deserializeJson(doc, "[42 \t\r\n]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -47,7 +47,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Values types") {
|
SECTION("Values types") {
|
||||||
SECTION("On integer") {
|
SECTION("On integer") {
|
||||||
DeserializationError err = deserializeJson(doc, "[42]");
|
DeserializationError err = deserializeJson(doc, "[42]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -56,7 +56,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Two integers") {
|
SECTION("Two integers") {
|
||||||
DeserializationError err = deserializeJson(doc, "[42,84]");
|
DeserializationError err = deserializeJson(doc, "[42,84]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -66,7 +66,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Double") {
|
SECTION("Double") {
|
||||||
DeserializationError err = deserializeJson(doc, "[4.2,1e2]");
|
DeserializationError err = deserializeJson(doc, "[4.2,1e2]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -76,7 +76,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Unsigned long") {
|
SECTION("Unsigned long") {
|
||||||
DeserializationError err = deserializeJson(doc, "[4294967295]");
|
DeserializationError err = deserializeJson(doc, "[4294967295]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -85,7 +85,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Boolean") {
|
SECTION("Boolean") {
|
||||||
DeserializationError err = deserializeJson(doc, "[true,false]");
|
DeserializationError err = deserializeJson(doc, "[true,false]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -95,7 +95,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Null") {
|
SECTION("Null") {
|
||||||
DeserializationError err = deserializeJson(doc, "[null,null]");
|
DeserializationError err = deserializeJson(doc, "[null,null]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -108,7 +108,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Double quotes") {
|
SECTION("Double quotes") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[ \"hello\" , \"world\" ]");
|
deserializeJson(doc, "[ \"hello\" , \"world\" ]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -118,7 +118,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Single quotes") {
|
SECTION("Single quotes") {
|
||||||
DeserializationError err = deserializeJson(doc, "[ 'hello' , 'world' ]");
|
DeserializationError err = deserializeJson(doc, "[ 'hello' , 'world' ]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -128,7 +128,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("No quotes") {
|
SECTION("No quotes") {
|
||||||
DeserializationError err = deserializeJson(doc, "[ hello , world ]");
|
DeserializationError err = deserializeJson(doc, "[ hello , world ]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -138,7 +138,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Double quotes (empty strings)") {
|
SECTION("Double quotes (empty strings)") {
|
||||||
DeserializationError err = deserializeJson(doc, "[\"\",\"\"]");
|
DeserializationError err = deserializeJson(doc, "[\"\",\"\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -148,7 +148,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Single quotes (empty strings)") {
|
SECTION("Single quotes (empty strings)") {
|
||||||
DeserializationError err = deserializeJson(doc, "[\'\',\'\']");
|
DeserializationError err = deserializeJson(doc, "[\'\',\'\']");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -179,7 +179,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Before opening bracket") {
|
SECTION("Before opening bracket") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "/*COMMENT*/ [\"hello\"]");
|
deserializeJson(doc, "/*COMMENT*/ [\"hello\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -189,7 +189,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("After opening bracket") {
|
SECTION("After opening bracket") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[/*COMMENT*/ \"hello\"]");
|
deserializeJson(doc, "[/*COMMENT*/ \"hello\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -198,7 +198,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("Before closing bracket") {
|
SECTION("Before closing bracket") {
|
||||||
DeserializationError err = deserializeJson(doc, "[\"hello\"/*COMMENT*/]");
|
DeserializationError err = deserializeJson(doc, "[\"hello\"/*COMMENT*/]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -207,7 +207,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("After closing bracket") {
|
SECTION("After closing bracket") {
|
||||||
DeserializationError err = deserializeJson(doc, "[\"hello\"]/*COMMENT*/");
|
DeserializationError err = deserializeJson(doc, "[\"hello\"]/*COMMENT*/");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -217,7 +217,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Before comma") {
|
SECTION("Before comma") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[\"hello\"/*COMMENT*/,\"world\"]");
|
deserializeJson(doc, "[\"hello\"/*COMMENT*/,\"world\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -228,7 +228,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("After comma") {
|
SECTION("After comma") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[\"hello\",/*COMMENT*/ \"world\"]");
|
deserializeJson(doc, "[\"hello\",/*COMMENT*/ \"world\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -256,7 +256,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Before opening bracket") {
|
SECTION("Before opening bracket") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "//COMMENT\n\t[\"hello\"]");
|
deserializeJson(doc, "//COMMENT\n\t[\"hello\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -265,7 +265,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("After opening bracket") {
|
SECTION("After opening bracket") {
|
||||||
DeserializationError err = deserializeJson(doc, "[//COMMENT\n\"hello\"]");
|
DeserializationError err = deserializeJson(doc, "[//COMMENT\n\"hello\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -275,7 +275,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Before closing bracket") {
|
SECTION("Before closing bracket") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[\"hello\"//COMMENT\r\n]");
|
deserializeJson(doc, "[\"hello\"//COMMENT\r\n]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -284,7 +284,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
|
|
||||||
SECTION("After closing bracket") {
|
SECTION("After closing bracket") {
|
||||||
DeserializationError err = deserializeJson(doc, "[\"hello\"]//COMMENT\n");
|
DeserializationError err = deserializeJson(doc, "[\"hello\"]//COMMENT\n");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -294,7 +294,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Before comma") {
|
SECTION("Before comma") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[\"hello\"//COMMENT\n,\"world\"]");
|
deserializeJson(doc, "[\"hello\"//COMMENT\n,\"world\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -305,7 +305,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("After comma") {
|
SECTION("After comma") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "[\"hello\",//COMMENT\n\"world\"]");
|
deserializeJson(doc, "[\"hello\",//COMMENT\n\"world\"]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(2 == arr.size());
|
REQUIRE(2 == arr.size());
|
||||||
@ -372,17 +372,17 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
" [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
|
" [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
|
||||||
|
|
||||||
DeserializationError err = deserializeJson(doc, jsonString);
|
DeserializationError err = deserializeJson(doc, jsonString);
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
JsonObject& object1 = arr[0];
|
JsonObject object1 = arr[0];
|
||||||
const JsonObject& object2 = arr[1];
|
const JsonObject object2 = arr[1];
|
||||||
JsonObject& object3 = arr[2];
|
JsonObject object3 = arr[2];
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
|
|
||||||
REQUIRE(true == object1.success());
|
REQUIRE(object1.isNull() == false);
|
||||||
REQUIRE(true == object2.success());
|
REQUIRE(object2.isNull() == false);
|
||||||
REQUIRE(false == object3.success());
|
REQUIRE(object3.isNull() == true);
|
||||||
|
|
||||||
REQUIRE(2 == object1.size());
|
REQUIRE(2 == object1.size());
|
||||||
REQUIRE(2 == object2.size());
|
REQUIRE(2 == object2.size());
|
||||||
@ -399,7 +399,7 @@ TEST_CASE("deserialize JSON array") {
|
|||||||
SECTION("Should clear the JsonArray") {
|
SECTION("Should clear the JsonArray") {
|
||||||
deserializeJson(doc, "[1,2,3,4]");
|
deserializeJson(doc, "[1,2,3,4]");
|
||||||
deserializeJson(doc, "[]");
|
deserializeJson(doc, "[]");
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(arr.size() == 0);
|
REQUIRE(arr.size() == 0);
|
||||||
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
|
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
|
||||||
|
@ -68,7 +68,7 @@ TEST_CASE("deserialize JSON array with a StaticJsonDocument") {
|
|||||||
deserializeJson(doc, input);
|
deserializeJson(doc, input);
|
||||||
deserializeJson(doc, "[]");
|
deserializeJson(doc, "[]");
|
||||||
|
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
REQUIRE(arr.size() == 0);
|
REQUIRE(arr.size() == 0);
|
||||||
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
|
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
|
||||||
}
|
}
|
||||||
@ -78,7 +78,7 @@ TEST_CASE("deserialize JSON array with a StaticJsonDocument") {
|
|||||||
char input[] = "[1,2]";
|
char input[] = "[1,2]";
|
||||||
|
|
||||||
DeserializationError err = deserializeJson(doc, input);
|
DeserializationError err = deserializeJson(doc, input);
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonArray>());
|
REQUIRE(doc.is<JsonArray>());
|
||||||
|
@ -10,7 +10,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("An empty object") {
|
SECTION("An empty object") {
|
||||||
DeserializationError err = deserializeJson(doc, "{}");
|
DeserializationError err = deserializeJson(doc, "{}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -20,7 +20,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Quotes") {
|
SECTION("Quotes") {
|
||||||
SECTION("Double quotes") {
|
SECTION("Double quotes") {
|
||||||
DeserializationError err = deserializeJson(doc, "{\"key\":\"value\"}");
|
DeserializationError err = deserializeJson(doc, "{\"key\":\"value\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -30,7 +30,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("Single quotes") {
|
SECTION("Single quotes") {
|
||||||
DeserializationError err = deserializeJson(doc, "{'key':'value'}");
|
DeserializationError err = deserializeJson(doc, "{'key':'value'}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -40,7 +40,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("No quotes") {
|
SECTION("No quotes") {
|
||||||
DeserializationError err = deserializeJson(doc, "{key:value}");
|
DeserializationError err = deserializeJson(doc, "{key:value}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -50,7 +50,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("No quotes, allow underscore in key") {
|
SECTION("No quotes, allow underscore in key") {
|
||||||
DeserializationError err = deserializeJson(doc, "{_k_e_y_:42}");
|
DeserializationError err = deserializeJson(doc, "{_k_e_y_:42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -62,7 +62,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Spaces") {
|
SECTION("Spaces") {
|
||||||
SECTION("Before the key") {
|
SECTION("Before the key") {
|
||||||
DeserializationError err = deserializeJson(doc, "{ \"key\":\"value\"}");
|
DeserializationError err = deserializeJson(doc, "{ \"key\":\"value\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -72,7 +72,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("After the key") {
|
SECTION("After the key") {
|
||||||
DeserializationError err = deserializeJson(doc, "{\"key\" :\"value\"}");
|
DeserializationError err = deserializeJson(doc, "{\"key\" :\"value\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -82,7 +82,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("Before the value") {
|
SECTION("Before the value") {
|
||||||
DeserializationError err = deserializeJson(doc, "{\"key\": \"value\"}");
|
DeserializationError err = deserializeJson(doc, "{\"key\": \"value\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -92,7 +92,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("After the value") {
|
SECTION("After the value") {
|
||||||
DeserializationError err = deserializeJson(doc, "{\"key\":\"value\" }");
|
DeserializationError err = deserializeJson(doc, "{\"key\":\"value\" }");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -103,7 +103,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before the colon") {
|
SECTION("Before the colon") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
|
deserializeJson(doc, "{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -115,7 +115,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After the colon") {
|
SECTION("After the colon") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
|
deserializeJson(doc, "{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -129,7 +129,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("String") {
|
SECTION("String") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
deserializeJson(doc, "{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -141,7 +141,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Integer") {
|
SECTION("Integer") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":42,\"key2\":-42}");
|
deserializeJson(doc, "{\"key1\":42,\"key2\":-42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -153,7 +153,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Double") {
|
SECTION("Double") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":12.345,\"key2\":-7E89}");
|
deserializeJson(doc, "{\"key1\":12.345,\"key2\":-7E89}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -165,7 +165,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Booleans") {
|
SECTION("Booleans") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":true,\"key2\":false}");
|
deserializeJson(doc, "{\"key1\":true,\"key2\":false}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -177,7 +177,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Null") {
|
SECTION("Null") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"key1\":null,\"key2\":null}");
|
deserializeJson(doc, "{\"key1\":null,\"key2\":null}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -190,17 +190,17 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
char jsonString[] = " { \"ab\" : [ 1 , 2 ] , \"cd\" : [ 3 , 4 ] } ";
|
char jsonString[] = " { \"ab\" : [ 1 , 2 ] , \"cd\" : [ 3 , 4 ] } ";
|
||||||
|
|
||||||
DeserializationError err = deserializeJson(doc, jsonString);
|
DeserializationError err = deserializeJson(doc, jsonString);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
JsonArray& array1 = obj["ab"];
|
JsonArray array1 = obj["ab"];
|
||||||
const JsonArray& array2 = obj["cd"];
|
const JsonArray array2 = obj["cd"];
|
||||||
JsonArray& array3 = obj["ef"];
|
JsonArray array3 = obj["ef"];
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
|
|
||||||
REQUIRE(true == array1.success());
|
REQUIRE(array1.isNull() == false);
|
||||||
REQUIRE(true == array2.success());
|
REQUIRE(array2.isNull() == false);
|
||||||
REQUIRE(false == array3.success());
|
REQUIRE(array3.isNull() == true);
|
||||||
|
|
||||||
REQUIRE(2 == array1.size());
|
REQUIRE(2 == array1.size());
|
||||||
REQUIRE(2 == array2.size());
|
REQUIRE(2 == array2.size());
|
||||||
@ -278,7 +278,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before opening brace") {
|
SECTION("Before opening brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "/*COMMENT*/ {\"hello\":\"world\"}");
|
deserializeJson(doc, "/*COMMENT*/ {\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -287,7 +287,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After opening brace") {
|
SECTION("After opening brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{/*COMMENT*/\"hello\":\"world\"}");
|
deserializeJson(doc, "{/*COMMENT*/\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -296,7 +296,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before colon") {
|
SECTION("Before colon") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\"/*COMMENT*/:\"world\"}");
|
deserializeJson(doc, "{\"hello\"/*COMMENT*/:\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -305,7 +305,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After colon") {
|
SECTION("After colon") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\":/*COMMENT*/\"world\"}");
|
deserializeJson(doc, "{\"hello\":/*COMMENT*/\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -314,7 +314,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before closing brace") {
|
SECTION("Before closing brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"/*COMMENT*/}");
|
deserializeJson(doc, "{\"hello\":\"world\"/*COMMENT*/}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -323,7 +323,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After closing brace") {
|
SECTION("After closing brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}/*COMMENT*/");
|
deserializeJson(doc, "{\"hello\":\"world\"}/*COMMENT*/");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -332,7 +332,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before comma") {
|
SECTION("Before comma") {
|
||||||
DeserializationError err = deserializeJson(
|
DeserializationError err = deserializeJson(
|
||||||
doc, "{\"hello\":\"world\"/*COMMENT*/,\"answer\":42}");
|
doc, "{\"hello\":\"world\"/*COMMENT*/,\"answer\":42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -342,7 +342,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After comma") {
|
SECTION("After comma") {
|
||||||
DeserializationError err = deserializeJson(
|
DeserializationError err = deserializeJson(
|
||||||
doc, "{\"hello\":\"world\",/*COMMENT*/\"answer\":42}");
|
doc, "{\"hello\":\"world\",/*COMMENT*/\"answer\":42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -354,7 +354,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before opening brace") {
|
SECTION("Before opening brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "//COMMENT\n {\"hello\":\"world\"}");
|
deserializeJson(doc, "//COMMENT\n {\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -363,7 +363,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After opening brace") {
|
SECTION("After opening brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{//COMMENT\n\"hello\":\"world\"}");
|
deserializeJson(doc, "{//COMMENT\n\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -372,7 +372,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before colon") {
|
SECTION("Before colon") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\"//COMMENT\n:\"world\"}");
|
deserializeJson(doc, "{\"hello\"//COMMENT\n:\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -381,7 +381,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After colon") {
|
SECTION("After colon") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\"://COMMENT\n\"world\"}");
|
deserializeJson(doc, "{\"hello\"://COMMENT\n\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -390,7 +390,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before closing brace") {
|
SECTION("Before closing brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"//COMMENT\n}");
|
deserializeJson(doc, "{\"hello\":\"world\"//COMMENT\n}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -399,7 +399,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After closing brace") {
|
SECTION("After closing brace") {
|
||||||
DeserializationError err =
|
DeserializationError err =
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}//COMMENT\n");
|
deserializeJson(doc, "{\"hello\":\"world\"}//COMMENT\n");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -408,7 +408,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Before comma") {
|
SECTION("Before comma") {
|
||||||
DeserializationError err = deserializeJson(
|
DeserializationError err = deserializeJson(
|
||||||
doc, "{\"hello\":\"world\"//COMMENT\n,\"answer\":42}");
|
doc, "{\"hello\":\"world\"//COMMENT\n,\"answer\":42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -418,7 +418,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("After comma") {
|
SECTION("After comma") {
|
||||||
DeserializationError err = deserializeJson(
|
DeserializationError err = deserializeJson(
|
||||||
doc, "{\"hello\":\"world\",//COMMENT\n\"answer\":42}");
|
doc, "{\"hello\":\"world\",//COMMENT\n\"answer\":42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -459,7 +459,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
|
|
||||||
SECTION("After closing brace") {
|
SECTION("After closing brace") {
|
||||||
DeserializationError err = deserializeJson(doc, "{\"hello\":\"world\"}/");
|
DeserializationError err = deserializeJson(doc, "{\"hello\":\"world\"}/");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(obj["hello"] == "world");
|
REQUIRE(obj["hello"] == "world");
|
||||||
@ -483,7 +483,7 @@ TEST_CASE("deserialize JSON object") {
|
|||||||
SECTION("Should clear the JsonObject") {
|
SECTION("Should clear the JsonObject") {
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
deserializeJson(doc, "{}");
|
deserializeJson(doc, "{}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
REQUIRE(obj.size() == 0);
|
REQUIRE(obj.size() == 0);
|
||||||
|
@ -13,7 +13,7 @@ TEST_CASE("deserializeJson(std::istream&)") {
|
|||||||
std::istringstream json(" [ 42 /* comment */ ] ");
|
std::istringstream json(" [ 42 /* comment */ ] ");
|
||||||
|
|
||||||
DeserializationError err = deserializeJson(doc, json);
|
DeserializationError err = deserializeJson(doc, json);
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == arr.size());
|
REQUIRE(1 == arr.size());
|
||||||
@ -24,7 +24,7 @@ TEST_CASE("deserializeJson(std::istream&)") {
|
|||||||
std::istringstream json(" { hello : world // comment\n }");
|
std::istringstream json(" { hello : world // comment\n }");
|
||||||
|
|
||||||
DeserializationError err = deserializeJson(doc, json);
|
DeserializationError err = deserializeJson(doc, json);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(1 == obj.size());
|
REQUIRE(1 == obj.size());
|
||||||
|
@ -28,7 +28,7 @@ TEST_CASE("deserializeJson(const std::string&)") {
|
|||||||
DeserializationError err = deserializeJson(doc, input);
|
DeserializationError err = deserializeJson(doc, input);
|
||||||
input[2] = 'X'; // alter the string tomake sure we made a copy
|
input[2] = 'X'; // alter the string tomake sure we made a copy
|
||||||
|
|
||||||
JsonArray &array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(std::string("hello") == array[0]);
|
REQUIRE(std::string("hello") == array[0]);
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonObject basics") {
|
TEST_CASE("JsonObject basics") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("SuccessIsTrue") {
|
SECTION("isNull()") {
|
||||||
REQUIRE(obj.success());
|
REQUIRE(obj.isNull() == false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::containsKey()") {
|
TEST_CASE("JsonObject::containsKey()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("ContainsKeyReturnsFalseForNonExistingKey") {
|
SECTION("ContainsKeyReturnsFalseForNonExistingKey") {
|
||||||
obj.set("hello", 42);
|
obj.set("hello", 42);
|
||||||
|
@ -9,7 +9,7 @@ using namespace Catch::Matchers;
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::get()") {
|
TEST_CASE("JsonObject::get()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("GetConstCharPointer_GivenStringLiteral") {
|
SECTION("GetConstCharPointer_GivenStringLiteral") {
|
||||||
obj.set("hello", "world");
|
obj.set("hello", "world");
|
||||||
|
@ -8,10 +8,10 @@
|
|||||||
using namespace Catch::Matchers;
|
using namespace Catch::Matchers;
|
||||||
|
|
||||||
TEST_CASE("JsonObject::invalid()") {
|
TEST_CASE("JsonObject::invalid()") {
|
||||||
JsonObject& obj = JsonObject::invalid();
|
JsonObject obj;
|
||||||
|
|
||||||
SECTION("SubscriptFails") {
|
SECTION("SubscriptFails") {
|
||||||
REQUIRE_FALSE(obj["key"].success());
|
REQUIRE(obj["key"].isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AddFails") {
|
SECTION("AddFails") {
|
||||||
@ -20,16 +20,16 @@ TEST_CASE("JsonObject::invalid()") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("CreateNestedArrayFails") {
|
SECTION("CreateNestedArrayFails") {
|
||||||
REQUIRE_FALSE(obj.createNestedArray("hello").success());
|
REQUIRE(obj.createNestedArray("hello").isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("CreateNestedObjectFails") {
|
SECTION("CreateNestedObjectFails") {
|
||||||
REQUIRE_FALSE(obj.createNestedObject("world").success());
|
REQUIRE(obj.createNestedObject("world").isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("PrintToWritesBraces") {
|
SECTION("serialize to 'null'") {
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
serializeJson(obj, buffer, sizeof(buffer));
|
serializeJson(obj, buffer, sizeof(buffer));
|
||||||
REQUIRE_THAT(buffer, Equals("{}"));
|
REQUIRE_THAT(buffer, Equals("null"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ using namespace Catch::Matchers;
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::begin()/end()") {
|
TEST_CASE("JsonObject::begin()/end()") {
|
||||||
StaticJsonDocument<JSON_OBJECT_SIZE(2)> doc;
|
StaticJsonDocument<JSON_OBJECT_SIZE(2)> doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["ab"] = 12;
|
obj["ab"] = 12;
|
||||||
obj["cd"] = 34;
|
obj["cd"] = 34;
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ TEST_CASE("JsonObject::begin()/end()") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ConstIterator") {
|
SECTION("ConstIterator") {
|
||||||
const JsonObject& const_object = obj;
|
const JsonObject const_object = obj;
|
||||||
JsonObject::const_iterator it = const_object.begin();
|
JsonObject::const_iterator it = const_object.begin();
|
||||||
|
|
||||||
REQUIRE(const_object.end() != it);
|
REQUIRE(const_object.end() != it);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::remove()") {
|
TEST_CASE("JsonObject::remove()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("SizeDecreased_WhenValuesAreRemoved") {
|
SECTION("SizeDecreased_WhenValuesAreRemoved") {
|
||||||
obj["hello"] = 1;
|
obj["hello"] = 1;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::set()") {
|
TEST_CASE("JsonObject::set()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("int") {
|
SECTION("int") {
|
||||||
obj.set("hello", 123);
|
obj.set("hello", 123);
|
||||||
@ -44,29 +44,29 @@ TEST_CASE("JsonObject::set()") {
|
|||||||
|
|
||||||
SECTION("nested array") {
|
SECTION("nested array") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
|
|
||||||
obj.set("hello", arr);
|
obj.set("hello", arr);
|
||||||
|
|
||||||
REQUIRE(&arr == &obj["hello"].as<JsonArray>());
|
REQUIRE(arr == obj["hello"].as<JsonArray>());
|
||||||
REQUIRE(obj["hello"].is<JsonArray&>());
|
REQUIRE(obj["hello"].is<JsonArray>());
|
||||||
REQUIRE_FALSE(obj["hello"].is<JsonObject&>());
|
REQUIRE_FALSE(obj["hello"].is<JsonObject>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nested object") {
|
SECTION("nested object") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
|
|
||||||
obj.set("hello", obj2);
|
obj.set("hello", obj2);
|
||||||
|
|
||||||
REQUIRE(&obj2 == &obj["hello"].as<JsonObject>());
|
REQUIRE(obj2 == obj["hello"].as<JsonObject>());
|
||||||
REQUIRE(obj["hello"].is<JsonObject&>());
|
REQUIRE(obj["hello"].is<JsonObject>());
|
||||||
REQUIRE_FALSE(obj["hello"].is<JsonArray&>());
|
REQUIRE_FALSE(obj["hello"].is<JsonArray>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array subscript") {
|
SECTION("array subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
arr.add(42);
|
arr.add(42);
|
||||||
|
|
||||||
obj.set("a", arr[0]);
|
obj.set("a", arr[0]);
|
||||||
@ -76,7 +76,7 @@ TEST_CASE("JsonObject::set()") {
|
|||||||
|
|
||||||
SECTION("object subscript") {
|
SECTION("object subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
obj2.set("x", 42);
|
obj2.set("x", 42);
|
||||||
|
|
||||||
obj.set("a", obj2["x"]);
|
obj.set("a", obj2["x"]);
|
||||||
@ -86,14 +86,14 @@ TEST_CASE("JsonObject::set()") {
|
|||||||
|
|
||||||
SECTION("returns true when allocation succeeds") {
|
SECTION("returns true when allocation succeeds") {
|
||||||
StaticJsonDocument<JSON_OBJECT_SIZE(1) + 15> doc2;
|
StaticJsonDocument<JSON_OBJECT_SIZE(1) + 15> doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(true == obj2.set(std::string("hello"), std::string("world")));
|
REQUIRE(true == obj2.set(std::string("hello"), std::string("world")));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("returns false when allocation fails") {
|
SECTION("returns false when allocation fails") {
|
||||||
StaticJsonDocument<JSON_OBJECT_SIZE(1) + 10> doc2;
|
StaticJsonDocument<JSON_OBJECT_SIZE(1) + 10> doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(false == obj2.set(std::string("hello"), std::string("world")));
|
REQUIRE(false == obj2.set(std::string("hello"), std::string("world")));
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::size()") {
|
TEST_CASE("JsonObject::size()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("initial size is zero") {
|
SECTION("initial size is zero") {
|
||||||
REQUIRE(0 == obj.size());
|
REQUIRE(0 == obj.size());
|
||||||
|
@ -17,7 +17,7 @@ TEST_CASE("std::string") {
|
|||||||
char json[] = "{\"key\":\"value\"}";
|
char json[] = "{\"key\":\"value\"}";
|
||||||
|
|
||||||
deserializeJson(doc, json);
|
deserializeJson(doc, json);
|
||||||
JsonObject &obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(std::string("value") == obj[std::string("key")]);
|
REQUIRE(std::string("value") == obj[std::string("key")]);
|
||||||
}
|
}
|
||||||
@ -26,13 +26,13 @@ TEST_CASE("std::string") {
|
|||||||
char json[] = "{\"key\":\"value\"}";
|
char json[] = "{\"key\":\"value\"}";
|
||||||
|
|
||||||
deserializeJson(doc, json);
|
deserializeJson(doc, json);
|
||||||
JsonObject &obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(std::string("value") == obj[std::string("key")]);
|
REQUIRE(std::string("value") == obj[std::string("key")]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(key)") {
|
SECTION("set(key)") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
std::string key("hello");
|
std::string key("hello");
|
||||||
obj.set(key, "world");
|
obj.set(key, "world");
|
||||||
eraseString(key);
|
eraseString(key);
|
||||||
@ -40,7 +40,7 @@ TEST_CASE("std::string") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(value)") {
|
SECTION("set(value)") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
std::string value("world");
|
std::string value("world");
|
||||||
obj.set("hello", value);
|
obj.set("hello", value);
|
||||||
eraseString(value);
|
eraseString(value);
|
||||||
@ -48,7 +48,7 @@ TEST_CASE("std::string") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(key,value)") {
|
SECTION("set(key,value)") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
std::string key("hello");
|
std::string key("hello");
|
||||||
std::string value("world");
|
std::string value("world");
|
||||||
obj.set(key, value);
|
obj.set(key, value);
|
||||||
@ -58,9 +58,9 @@ TEST_CASE("std::string") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(JsonArraySubscript)") {
|
SECTION("set(JsonArraySubscript)") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray &arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
arr.add("world");
|
arr.add("world");
|
||||||
|
|
||||||
obj.set(std::string("hello"), arr[0]);
|
obj.set(std::string("hello"), arr[0]);
|
||||||
@ -69,9 +69,9 @@ TEST_CASE("std::string") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("set(JsonObjectSubscript)") {
|
SECTION("set(JsonObjectSubscript)") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject &obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
obj2.set("x", "world");
|
obj2.set("x", "world");
|
||||||
|
|
||||||
obj.set(std::string("hello"), obj2["x"]);
|
obj.set(std::string("hello"), obj2["x"]);
|
||||||
@ -82,7 +82,7 @@ TEST_CASE("std::string") {
|
|||||||
SECTION("get<T>()") {
|
SECTION("get<T>()") {
|
||||||
char json[] = "{\"key\":\"value\"}";
|
char json[] = "{\"key\":\"value\"}";
|
||||||
deserializeJson(doc, json);
|
deserializeJson(doc, json);
|
||||||
JsonObject &obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(std::string("value") == obj.get<const char *>(std::string("key")));
|
REQUIRE(std::string("value") == obj.get<const char *>(std::string("key")));
|
||||||
}
|
}
|
||||||
@ -90,13 +90,13 @@ TEST_CASE("std::string") {
|
|||||||
SECTION("is<T>()") {
|
SECTION("is<T>()") {
|
||||||
char json[] = "{\"key\":\"value\"}";
|
char json[] = "{\"key\":\"value\"}";
|
||||||
deserializeJson(doc, json);
|
deserializeJson(doc, json);
|
||||||
JsonObject &obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(true == obj.is<const char *>(std::string("key")));
|
REQUIRE(true == obj.is<const char *>(std::string("key")));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("createNestedObject()") {
|
SECTION("createNestedObject()") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
std::string key = "key";
|
std::string key = "key";
|
||||||
char json[64];
|
char json[64];
|
||||||
obj.createNestedObject(key);
|
obj.createNestedObject(key);
|
||||||
@ -106,7 +106,7 @@ TEST_CASE("std::string") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("createNestedArray()") {
|
SECTION("createNestedArray()") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
std::string key = "key";
|
std::string key = "key";
|
||||||
char json[64];
|
char json[64];
|
||||||
obj.createNestedArray(key);
|
obj.createNestedArray(key);
|
||||||
@ -118,12 +118,12 @@ TEST_CASE("std::string") {
|
|||||||
SECTION("containsKey()") {
|
SECTION("containsKey()") {
|
||||||
char json[] = "{\"key\":\"value\"}";
|
char json[] = "{\"key\":\"value\"}";
|
||||||
deserializeJson(doc, json);
|
deserializeJson(doc, json);
|
||||||
JsonObject &obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(true == obj.containsKey(std::string("key")));
|
REQUIRE(true == obj.containsKey(std::string("key")));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("remove()") {
|
SECTION("remove()") {
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["key"] = "value";
|
obj["key"] = "value";
|
||||||
|
|
||||||
obj.remove(std::string("key"));
|
obj.remove(std::string("key"));
|
||||||
@ -133,7 +133,7 @@ TEST_CASE("std::string") {
|
|||||||
|
|
||||||
SECTION("operator[], set key") {
|
SECTION("operator[], set key") {
|
||||||
std::string key("hello");
|
std::string key("hello");
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj[key] = "world";
|
obj[key] = "world";
|
||||||
eraseString(key);
|
eraseString(key);
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -141,7 +141,7 @@ TEST_CASE("std::string") {
|
|||||||
|
|
||||||
SECTION("operator[], set value") {
|
SECTION("operator[], set value") {
|
||||||
std::string value("world");
|
std::string value("world");
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["hello"] = value;
|
obj["hello"] = value;
|
||||||
eraseString(value);
|
eraseString(value);
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -149,7 +149,7 @@ TEST_CASE("std::string") {
|
|||||||
|
|
||||||
SECTION("memoryUsage() increases when adding a new key") {
|
SECTION("memoryUsage() increases when adding a new key") {
|
||||||
std::string key1("hello"), key2("world");
|
std::string key1("hello"), key2("world");
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
obj[key1] = 1;
|
obj[key1] = 1;
|
||||||
size_t sizeBefore = doc.memoryUsage();
|
size_t sizeBefore = doc.memoryUsage();
|
||||||
@ -161,7 +161,7 @@ TEST_CASE("std::string") {
|
|||||||
|
|
||||||
SECTION("memoryUsage() remains when adding the same key") {
|
SECTION("memoryUsage() remains when adding the same key") {
|
||||||
std::string key("hello");
|
std::string key("hello");
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
obj[key] = 1;
|
obj[key] = 1;
|
||||||
size_t sizeBefore = doc.memoryUsage();
|
size_t sizeBefore = doc.memoryUsage();
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("JsonObject::operator[]") {
|
TEST_CASE("JsonObject::operator[]") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("int") {
|
SECTION("int") {
|
||||||
obj["hello"] = 123;
|
obj["hello"] = 123;
|
||||||
@ -53,41 +53,37 @@ TEST_CASE("JsonObject::operator[]") {
|
|||||||
|
|
||||||
SECTION("array") {
|
SECTION("array") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
|
|
||||||
obj["hello"] = arr;
|
obj["hello"] = arr;
|
||||||
|
|
||||||
REQUIRE(&arr == &obj["hello"].as<JsonArray&>());
|
REQUIRE(arr == obj["hello"].as<JsonArray>());
|
||||||
REQUIRE(&arr == &obj["hello"].as<JsonArray>()); // <- short hand
|
REQUIRE(arr == obj["hello"].as<JsonArray>()); // <- short hand
|
||||||
REQUIRE(&arr == &obj["hello"].as<const JsonArray&>());
|
// REQUIRE(arr == obj["hello"].as<const JsonArray>());
|
||||||
REQUIRE(&arr == &obj["hello"].as<const JsonArray>()); // <- short hand
|
// REQUIRE(arr == obj["hello"].as<const JsonArray>()); // <- short hand
|
||||||
REQUIRE(true == obj["hello"].is<JsonArray&>());
|
REQUIRE(true == obj["hello"].is<JsonArray>());
|
||||||
REQUIRE(true == obj["hello"].is<JsonArray>());
|
REQUIRE(true == obj["hello"].is<JsonArray>());
|
||||||
REQUIRE(true == obj["hello"].is<const JsonArray&>());
|
|
||||||
REQUIRE(true == obj["hello"].is<const JsonArray>());
|
REQUIRE(true == obj["hello"].is<const JsonArray>());
|
||||||
REQUIRE(false == obj["hello"].is<JsonObject&>());
|
REQUIRE(true == obj["hello"].is<const JsonArray>());
|
||||||
|
REQUIRE(false == obj["hello"].is<JsonObject>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object") {
|
SECTION("object") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
|
|
||||||
obj["hello"] = obj2;
|
obj["hello"] = obj2;
|
||||||
|
|
||||||
REQUIRE(&obj2 == &obj["hello"].as<JsonObject&>());
|
REQUIRE(obj2 == obj["hello"].as<JsonObject>());
|
||||||
REQUIRE(&obj2 == &obj["hello"].as<JsonObject>()); // <- short hand
|
REQUIRE(obj2 == obj["hello"].as<const JsonObject>());
|
||||||
REQUIRE(&obj2 == &obj["hello"].as<const JsonObject&>());
|
|
||||||
REQUIRE(&obj2 == &obj["hello"].as<const JsonObject>()); // <- short hand
|
|
||||||
REQUIRE(true == obj["hello"].is<JsonObject&>());
|
|
||||||
REQUIRE(true == obj["hello"].is<JsonObject>());
|
REQUIRE(true == obj["hello"].is<JsonObject>());
|
||||||
REQUIRE(true == obj["hello"].is<const JsonObject&>());
|
|
||||||
REQUIRE(true == obj["hello"].is<const JsonObject>());
|
REQUIRE(true == obj["hello"].is<const JsonObject>());
|
||||||
REQUIRE(false == obj["hello"].is<JsonArray&>());
|
REQUIRE(false == obj["hello"].is<JsonArray>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array subscript") {
|
SECTION("array subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
arr.add(42);
|
arr.add(42);
|
||||||
|
|
||||||
obj["a"] = arr[0];
|
obj["a"] = arr[0];
|
||||||
@ -97,7 +93,7 @@ TEST_CASE("JsonObject::operator[]") {
|
|||||||
|
|
||||||
SECTION("object subscript") {
|
SECTION("object subscript") {
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
obj2.set("x", 42);
|
obj2.set("x", 42);
|
||||||
|
|
||||||
obj["a"] = obj2["x"];
|
obj["a"] = obj2["x"];
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
static void check(JsonArray &array, std::string expected) {
|
static void check(JsonArray array, std::string expected) {
|
||||||
std::string actual;
|
std::string actual;
|
||||||
size_t actualLen = serializeJson(array, actual);
|
size_t actualLen = serializeJson(array, actual);
|
||||||
REQUIRE(expected == actual);
|
REQUIRE(expected == actual);
|
||||||
@ -16,7 +16,7 @@ static void check(JsonArray &array, std::string expected) {
|
|||||||
|
|
||||||
TEST_CASE("serializeJson(JsonArray)") {
|
TEST_CASE("serializeJson(JsonArray)") {
|
||||||
StaticJsonDocument<JSON_ARRAY_SIZE(2)> doc;
|
StaticJsonDocument<JSON_ARRAY_SIZE(2)> doc;
|
||||||
JsonArray &array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("Empty") {
|
SECTION("Empty") {
|
||||||
check(array, "[]");
|
check(array, "[]");
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
static void check(JsonArray& array, std::string expected) {
|
static void check(JsonArray array, std::string expected) {
|
||||||
std::string actual;
|
std::string actual;
|
||||||
size_t actualLen = serializeJsonPretty(array, actual);
|
size_t actualLen = serializeJsonPretty(array, actual);
|
||||||
size_t measuredLen = measureJsonPretty(array);
|
size_t measuredLen = measureJsonPretty(array);
|
||||||
@ -16,7 +16,7 @@ static void check(JsonArray& array, std::string expected) {
|
|||||||
|
|
||||||
TEST_CASE("serializeJsonPretty(JsonArray)") {
|
TEST_CASE("serializeJsonPretty(JsonArray)") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("Empty") {
|
SECTION("Empty") {
|
||||||
check(array, "[]");
|
check(array, "[]");
|
||||||
@ -54,11 +54,11 @@ TEST_CASE("serializeJsonPretty(JsonArray)") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("NestedArrays") {
|
SECTION("NestedArrays") {
|
||||||
JsonArray& nested1 = array.createNestedArray();
|
JsonArray nested1 = array.createNestedArray();
|
||||||
nested1.add(1);
|
nested1.add(1);
|
||||||
nested1.add(2);
|
nested1.add(2);
|
||||||
|
|
||||||
JsonObject& nested2 = array.createNestedObject();
|
JsonObject nested2 = array.createNestedObject();
|
||||||
nested2["key"] = 3;
|
nested2["key"] = 3;
|
||||||
|
|
||||||
check(array,
|
check(array,
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
void check(const JsonObject &obj, const std::string &expected) {
|
void check(const JsonObject obj, const std::string &expected) {
|
||||||
char actual[256];
|
char actual[256];
|
||||||
size_t actualLen = serializeJson(obj, actual);
|
size_t actualLen = serializeJson(obj, actual);
|
||||||
size_t measuredLen = measureJson(obj);
|
size_t measuredLen = measureJson(obj);
|
||||||
@ -18,7 +18,7 @@ void check(const JsonObject &obj, const std::string &expected) {
|
|||||||
|
|
||||||
TEST_CASE("serializeJson(JsonObject)") {
|
TEST_CASE("serializeJson(JsonObject)") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("EmptyObject") {
|
SECTION("EmptyObject") {
|
||||||
check(obj, "{}");
|
check(obj, "{}");
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
void check(const JsonObject &obj, const std::string expected) {
|
void check(const JsonObject obj, const std::string expected) {
|
||||||
char json[256];
|
char json[256];
|
||||||
|
|
||||||
size_t actualLen = serializeJsonPretty(obj, json);
|
size_t actualLen = serializeJsonPretty(obj, json);
|
||||||
@ -19,7 +19,7 @@ void check(const JsonObject &obj, const std::string expected) {
|
|||||||
|
|
||||||
TEST_CASE("serializeJsonPretty(JsonObject)") {
|
TEST_CASE("serializeJsonPretty(JsonObject)") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("EmptyObject") {
|
SECTION("EmptyObject") {
|
||||||
check(obj, "{}");
|
check(obj, "{}");
|
||||||
@ -57,10 +57,10 @@ TEST_CASE("serializeJsonPretty(JsonObject)") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("NestedContainers") {
|
SECTION("NestedContainers") {
|
||||||
JsonObject &nested1 = obj.createNestedObject("key1");
|
JsonObject nested1 = obj.createNestedObject("key1");
|
||||||
nested1["a"] = 1;
|
nested1["a"] = 1;
|
||||||
|
|
||||||
JsonArray &nested2 = obj.createNestedArray("key2");
|
JsonArray nested2 = obj.createNestedArray("key2");
|
||||||
nested2.add(2);
|
nested2.add(2);
|
||||||
|
|
||||||
check(obj,
|
check(obj,
|
||||||
|
@ -14,11 +14,11 @@ void check(JsonVariant variant, const std::string &expected) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("serializeJson(JsonVariant)") {
|
TEST_CASE("serializeJson(JsonVariant)") {
|
||||||
SECTION("Empty") {
|
SECTION("Undefined") {
|
||||||
check(JsonVariant(), "");
|
check(JsonVariant(), "null");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("Null") {
|
SECTION("Null string") {
|
||||||
check(static_cast<char *>(0), "null");
|
check(static_cast<char *>(0), "null");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ TEST_CASE("operator<<(std::ostream)") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("JsonObject") {
|
SECTION("JsonObject") {
|
||||||
JsonObject& object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
object["key"] = "value";
|
object["key"] = "value";
|
||||||
|
|
||||||
os << object;
|
os << object;
|
||||||
@ -36,7 +36,7 @@ TEST_CASE("operator<<(std::ostream)") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("JsonObjectSubscript") {
|
SECTION("JsonObjectSubscript") {
|
||||||
JsonObject& object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
object["key"] = "value";
|
object["key"] = "value";
|
||||||
|
|
||||||
os << object["key"];
|
os << object["key"];
|
||||||
@ -45,7 +45,7 @@ TEST_CASE("operator<<(std::ostream)") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("JsonArray") {
|
SECTION("JsonArray") {
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
array.add("value");
|
array.add("value");
|
||||||
|
|
||||||
os << array;
|
os << array;
|
||||||
@ -54,7 +54,7 @@ TEST_CASE("operator<<(std::ostream)") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("JsonArraySubscript") {
|
SECTION("JsonArraySubscript") {
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
array.add("value");
|
array.add("value");
|
||||||
|
|
||||||
os << array[0];
|
os << array[0];
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("serialize JsonArray to std::string") {
|
TEST_CASE("serialize JsonArray to std::string") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray &array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
array.add(4);
|
array.add(4);
|
||||||
array.add(2);
|
array.add(2);
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ TEST_CASE("serialize JsonArray to std::string") {
|
|||||||
|
|
||||||
TEST_CASE("serialize JsonObject to std::string") {
|
TEST_CASE("serialize JsonObject to std::string") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject &obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["key"] = "value";
|
obj["key"] = "value";
|
||||||
|
|
||||||
SECTION("object") {
|
SECTION("object") {
|
||||||
|
@ -7,10 +7,10 @@ add_executable(JsonVariantTests
|
|||||||
compare.cpp
|
compare.cpp
|
||||||
copy.cpp
|
copy.cpp
|
||||||
is.cpp
|
is.cpp
|
||||||
|
isnull.cpp
|
||||||
or.cpp
|
or.cpp
|
||||||
set_get.cpp
|
set_get.cpp
|
||||||
subscript.cpp
|
subscript.cpp
|
||||||
success.cpp
|
|
||||||
undefined.cpp
|
undefined.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ TEST_CASE("JsonVariant::as()") {
|
|||||||
|
|
||||||
SECTION("ObjectAsString") {
|
SECTION("ObjectAsString") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
obj["key"] = "value";
|
obj["key"] = "value";
|
||||||
|
|
||||||
@ -203,7 +203,7 @@ TEST_CASE("JsonVariant::as()") {
|
|||||||
|
|
||||||
SECTION("ArrayAsString") {
|
SECTION("ArrayAsString") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add(4);
|
arr.add(4);
|
||||||
arr.add(2);
|
arr.add(2);
|
||||||
|
|
||||||
@ -213,19 +213,19 @@ TEST_CASE("JsonVariant::as()") {
|
|||||||
|
|
||||||
SECTION("ArrayAsJsonArray") {
|
SECTION("ArrayAsJsonArray") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
|
|
||||||
JsonVariant variant = arr;
|
JsonVariant variant = arr;
|
||||||
REQUIRE(&arr == &variant.as<JsonArray&>());
|
REQUIRE(arr == variant.as<JsonArray>());
|
||||||
REQUIRE(&arr == &variant.as<JsonArray>()); // <- shorthand
|
REQUIRE(arr == variant.as<JsonArray>()); // <- shorthand
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ObjectAsJsonObject") {
|
SECTION("ObjectAsJsonObject") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
JsonVariant variant = obj;
|
JsonVariant variant = obj;
|
||||||
REQUIRE(&obj == &variant.as<JsonObject&>());
|
REQUIRE(obj == variant.as<JsonObject>());
|
||||||
REQUIRE(&obj == &variant.as<JsonObject>()); // <- shorthand
|
REQUIRE(obj == variant.as<JsonObject>()); // <- shorthand
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,9 +213,9 @@ TEST_CASE("JsonVariant comparisons") {
|
|||||||
|
|
||||||
SECTION("ArrayInVariant") {
|
SECTION("ArrayInVariant") {
|
||||||
DynamicJsonDocument doc1;
|
DynamicJsonDocument doc1;
|
||||||
JsonArray& array1 = doc1.to<JsonArray>();
|
JsonArray array1 = doc1.to<JsonArray>();
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& array2 = doc2.to<JsonArray>();
|
JsonArray array2 = doc2.to<JsonArray>();
|
||||||
|
|
||||||
JsonVariant variant1 = array1;
|
JsonVariant variant1 = array1;
|
||||||
JsonVariant variant2 = array1;
|
JsonVariant variant2 = array1;
|
||||||
@ -230,9 +230,9 @@ TEST_CASE("JsonVariant comparisons") {
|
|||||||
|
|
||||||
SECTION("ObjectInVariant") {
|
SECTION("ObjectInVariant") {
|
||||||
DynamicJsonDocument doc1;
|
DynamicJsonDocument doc1;
|
||||||
JsonObject& obj1 = doc1.to<JsonObject>();
|
JsonObject obj1 = doc1.to<JsonObject>();
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonObject& obj2 = doc2.to<JsonObject>();
|
JsonObject obj2 = doc2.to<JsonObject>();
|
||||||
|
|
||||||
JsonVariant variant1 = obj1;
|
JsonVariant variant1 = obj1;
|
||||||
JsonVariant variant2 = obj1;
|
JsonVariant variant2 = obj1;
|
||||||
@ -247,10 +247,10 @@ TEST_CASE("JsonVariant comparisons") {
|
|||||||
|
|
||||||
SECTION("VariantsOfDifferentTypes") {
|
SECTION("VariantsOfDifferentTypes") {
|
||||||
DynamicJsonDocument doc1;
|
DynamicJsonDocument doc1;
|
||||||
JsonObject& obj = doc1.to<JsonObject>();
|
JsonObject obj = doc1.to<JsonObject>();
|
||||||
|
|
||||||
DynamicJsonDocument doc2;
|
DynamicJsonDocument doc2;
|
||||||
JsonArray& arr = doc2.to<JsonArray>();
|
JsonArray arr = doc2.to<JsonArray>();
|
||||||
JsonVariant variants[] = {
|
JsonVariant variants[] = {
|
||||||
true, 42, 666.667, "hello", arr, obj,
|
true, 42, 666.667, "hello", arr, obj,
|
||||||
};
|
};
|
||||||
|
@ -43,7 +43,7 @@ TEST_CASE("JsonVariant copy") {
|
|||||||
|
|
||||||
SECTION("ObjectsAreCopiedByReference") {
|
SECTION("ObjectsAreCopiedByReference") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
|
|
||||||
_variant1 = object;
|
_variant1 = object;
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ TEST_CASE("JsonVariant copy") {
|
|||||||
|
|
||||||
SECTION("ArraysAreCopiedByReference") {
|
SECTION("ArraysAreCopiedByReference") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
_variant1 = array;
|
_variant1 = array;
|
||||||
|
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
|
|
||||||
void checkIsArray(JsonVariant var) {
|
void checkIsArray(JsonVariant var) {
|
||||||
REQUIRE(var.is<JsonArray>());
|
REQUIRE(var.is<JsonArray>());
|
||||||
REQUIRE(var.is<JsonArray&>());
|
REQUIRE(var.is<JsonArray>());
|
||||||
|
REQUIRE(var.is<const JsonArray>());
|
||||||
REQUIRE(var.is<const JsonArray>());
|
REQUIRE(var.is<const JsonArray>());
|
||||||
REQUIRE(var.is<const JsonArray&>());
|
|
||||||
|
|
||||||
REQUIRE_FALSE(var.is<bool>());
|
REQUIRE_FALSE(var.is<bool>());
|
||||||
REQUIRE_FALSE(var.is<double>());
|
REQUIRE_FALSE(var.is<double>());
|
||||||
@ -71,7 +71,7 @@ void checkIsString(JsonVariant var) {
|
|||||||
TEST_CASE("JsonVariant::is()") {
|
TEST_CASE("JsonVariant::is()") {
|
||||||
SECTION("JsonArray") {
|
SECTION("JsonArray") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
checkIsArray(array);
|
checkIsArray(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,40 +5,40 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
TEST_CASE("JsonVariant::success()") {
|
TEST_CASE("JsonVariant::isNull()") {
|
||||||
SECTION("ReturnsFalse_WhenUndefined") {
|
SECTION("ReturnsFalse_WhenUndefined") {
|
||||||
JsonVariant variant;
|
JsonVariant variant;
|
||||||
REQUIRE(false == variant.success());
|
REQUIRE(variant.isNull() == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ReturnsTrue_WhenInteger") {
|
SECTION("ReturnsTrue_WhenInteger") {
|
||||||
JsonVariant variant = 0;
|
JsonVariant variant = 0;
|
||||||
REQUIRE(true == variant.success());
|
REQUIRE(variant.isNull() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ReturnsTrue_WhenEmptyArray") {
|
SECTION("ReturnsTrue_WhenEmptyArray") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
JsonVariant variant = array;
|
JsonVariant variant = array;
|
||||||
REQUIRE(true == variant.success());
|
REQUIRE(variant.isNull() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ReturnsTrue_WhenEmptyObject") {
|
SECTION("ReturnsTrue_WhenEmptyObject") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
|
|
||||||
JsonVariant variant = obj;
|
JsonVariant variant = obj;
|
||||||
REQUIRE(true == variant.success());
|
REQUIRE(variant.isNull() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ReturnsFalse_WhenInvalidArray") {
|
SECTION("ReturnsFalse_WhenInvalidArray") {
|
||||||
JsonVariant variant = JsonArray::invalid();
|
JsonVariant variant = JsonArray();
|
||||||
REQUIRE(false == variant.success());
|
REQUIRE(variant.isNull() == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ReturnsFalse_WhenInvalidObject") {
|
SECTION("ReturnsFalse_WhenInvalidObject") {
|
||||||
JsonVariant variant = JsonObject::invalid();
|
JsonVariant variant = JsonObject();
|
||||||
REQUIRE(false == variant.success());
|
REQUIRE(variant.isNull() == true);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -123,8 +123,8 @@ TEST_CASE("JsonVariant set()/get()") {
|
|||||||
|
|
||||||
SECTION("CanStoreObject") {
|
SECTION("CanStoreObject") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject &object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
|
|
||||||
checkReference<JsonObject>(object);
|
checkValue<JsonObject>(object);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
TEST_CASE("JsonVariant::operator[]") {
|
TEST_CASE("JsonVariant::operator[]") {
|
||||||
SECTION("Array") {
|
SECTION("Array") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
array.add("element at index 0");
|
array.add("element at index 0");
|
||||||
array.add("element at index 1");
|
array.add("element at index 1");
|
||||||
|
|
||||||
@ -19,14 +19,14 @@ TEST_CASE("JsonVariant::operator[]") {
|
|||||||
REQUIRE(std::string("element at index 1") == var[1]);
|
REQUIRE(std::string("element at index 1") == var[1]);
|
||||||
REQUIRE(std::string("element at index 0") ==
|
REQUIRE(std::string("element at index 0") ==
|
||||||
var[static_cast<unsigned char>(0)]); // issue #381
|
var[static_cast<unsigned char>(0)]); // issue #381
|
||||||
REQUIRE_FALSE(var[666].success());
|
REQUIRE(var[666].isNull());
|
||||||
REQUIRE_FALSE(var[3].success());
|
REQUIRE(var[3].isNull());
|
||||||
REQUIRE_FALSE(var["0"].success());
|
REQUIRE(var["0"].isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("Object") {
|
SECTION("Object") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
object["a"] = "element at key \"a\"";
|
object["a"] = "element at key \"a\"";
|
||||||
object["b"] = "element at key \"b\"";
|
object["b"] = "element at key \"b\"";
|
||||||
|
|
||||||
@ -35,27 +35,27 @@ TEST_CASE("JsonVariant::operator[]") {
|
|||||||
REQUIRE(2 == var.size());
|
REQUIRE(2 == var.size());
|
||||||
REQUIRE(std::string("element at key \"a\"") == var["a"]);
|
REQUIRE(std::string("element at key \"a\"") == var["a"]);
|
||||||
REQUIRE(std::string("element at key \"b\"") == var["b"]);
|
REQUIRE(std::string("element at key \"b\"") == var["b"]);
|
||||||
REQUIRE_FALSE(var["c"].success());
|
REQUIRE(var["c"].isNull());
|
||||||
REQUIRE_FALSE(var[0].success());
|
REQUIRE(var[0].isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("Undefined") {
|
SECTION("Undefined") {
|
||||||
JsonVariant var = JsonVariant();
|
JsonVariant var = JsonVariant();
|
||||||
REQUIRE(0 == var.size());
|
REQUIRE(0 == var.size());
|
||||||
REQUIRE_FALSE(var["0"].success());
|
REQUIRE(var["0"].isNull());
|
||||||
REQUIRE_FALSE(var[0].success());
|
REQUIRE(var[0].isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("String") {
|
SECTION("String") {
|
||||||
JsonVariant var = "hello world";
|
JsonVariant var = "hello world";
|
||||||
REQUIRE(0 == var.size());
|
REQUIRE(0 == var.size());
|
||||||
REQUIRE_FALSE(var["0"].success());
|
REQUIRE(var["0"].isNull());
|
||||||
REQUIRE_FALSE(var[0].success());
|
REQUIRE(var[0].isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("ObjectSetValue") {
|
SECTION("ObjectSetValue") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
JsonVariant var = obj;
|
JsonVariant var = obj;
|
||||||
var["hello"] = "world";
|
var["hello"] = "world";
|
||||||
REQUIRE(1 == var.size());
|
REQUIRE(1 == var.size());
|
||||||
@ -64,7 +64,7 @@ TEST_CASE("JsonVariant::operator[]") {
|
|||||||
|
|
||||||
SECTION("ArraySetValue") {
|
SECTION("ArraySetValue") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
JsonVariant var = arr;
|
JsonVariant var = arr;
|
||||||
var[0] = "world";
|
var[0] = "world";
|
||||||
|
@ -29,26 +29,26 @@ TEST_CASE("JsonVariant undefined") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AsArrayReturnInvalid") {
|
SECTION("AsArrayReturnInvalid") {
|
||||||
REQUIRE(JsonArray::invalid() == variant.as<JsonArray&>());
|
REQUIRE(JsonArray() == variant.as<JsonArray>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AsConstArrayReturnInvalid") {
|
SECTION("AsConstArrayReturnInvalid") {
|
||||||
REQUIRE(JsonArray::invalid() == variant.as<const JsonArray&>());
|
REQUIRE(JsonArray() == variant.as<const JsonArray>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AsObjectReturnInvalid") {
|
SECTION("AsObjectReturnInvalid") {
|
||||||
REQUIRE(JsonObject::invalid() == variant.as<JsonObject&>());
|
REQUIRE(JsonObject() == variant.as<JsonObject>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AsConstObjectReturnInvalid") {
|
SECTION("AsConstObjectReturnInvalid") {
|
||||||
REQUIRE(JsonObject::invalid() == variant.as<const JsonObject&>());
|
REQUIRE(JsonObject() == variant.as<const JsonObject>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AsArrayWrapperReturnInvalid") {
|
SECTION("AsArrayWrapperReturnInvalid") {
|
||||||
REQUIRE(JsonArray::invalid() == variant.as<JsonArray>());
|
REQUIRE(JsonArray() == variant.as<JsonArray>());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("AsObjectWrapperReturnInvalid") {
|
SECTION("AsObjectWrapperReturnInvalid") {
|
||||||
REQUIRE(JsonObject::invalid() == variant.as<JsonObject>());
|
REQUIRE(JsonObject() == variant.as<JsonObject>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char key[] = "hello";
|
unsigned char key[] = "hello";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj[key] = "world";
|
obj[key] = "world";
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -113,7 +113,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
|
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(std::string("world") == obj[key]);
|
REQUIRE(std::string("world") == obj[key]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -123,7 +123,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(std::string("world") == obj.get<char*>(key));
|
REQUIRE(std::string("world") == obj.get<char*>(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char key[] = "hello";
|
unsigned char key[] = "hello";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.set(key, "world");
|
obj.set(key, "world");
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -141,7 +141,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.set("hello", value);
|
obj.set("hello", value);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -151,7 +151,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char key[] = "world";
|
unsigned char key[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.set(key, key);
|
obj.set(key, key);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["world"]);
|
REQUIRE(std::string("world") == obj["world"]);
|
||||||
@ -162,7 +162,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(true == obj.containsKey(key));
|
REQUIRE(true == obj.containsKey(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
obj.remove(key);
|
obj.remove(key);
|
||||||
|
|
||||||
REQUIRE(0 == obj.size());
|
REQUIRE(0 == obj.size());
|
||||||
@ -182,7 +182,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":42}");
|
deserializeJson(doc, "{\"hello\":42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(true == obj.is<int>(key));
|
REQUIRE(true == obj.is<int>(key));
|
||||||
}
|
}
|
||||||
@ -191,7 +191,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char key[] = "hello";
|
unsigned char key[] = "hello";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.createNestedArray(key);
|
obj.createNestedArray(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char key[] = "hello";
|
unsigned char key[] = "hello";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.createNestedObject(key);
|
obj.createNestedObject(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -209,7 +209,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["hello"] = value;
|
obj["hello"] = value;
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -219,7 +219,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["hello"].set(value);
|
obj["hello"].set(value);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -231,7 +231,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add(value);
|
arr.add(value);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == arr[0]);
|
REQUIRE(std::string("world") == arr[0]);
|
||||||
@ -241,7 +241,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
arr.set(0, value);
|
arr.set(0, value);
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
arr[0].set(value);
|
arr[0].set(value);
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ TEST_CASE("unsigned char[]") {
|
|||||||
unsigned char value[] = "world";
|
unsigned char value[] = "world";
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
arr[0] = value;
|
arr[0] = value;
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "hello");
|
strcpy(vla, "hello");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj[vla] = "world";
|
obj[vla] = "world";
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -142,7 +142,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
|
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(std::string("world") == obj[vla]);
|
REQUIRE(std::string("world") == obj[vla]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -155,7 +155,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
|
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(std::string("world") == obj.get<char*>(vla));
|
REQUIRE(std::string("world") == obj.get<char*>(vla));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "hello");
|
strcpy(vla, "hello");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.set(vla, "world");
|
obj.set(vla, "world");
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -177,7 +177,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.set("hello", vla);
|
obj.set("hello", vla);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"]);
|
REQUIRE(std::string("world") == obj["hello"]);
|
||||||
@ -189,7 +189,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.set(vla, vla);
|
obj.set(vla, vla);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["world"]);
|
REQUIRE(std::string("world") == obj["world"]);
|
||||||
@ -203,7 +203,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
|
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
REQUIRE(true == obj.containsKey(vla));
|
REQUIRE(true == obj.containsKey(vla));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":\"world\"}");
|
deserializeJson(doc, "{\"hello\":\"world\"}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
obj.remove(vla);
|
obj.remove(vla);
|
||||||
|
|
||||||
REQUIRE(0 == obj.size());
|
REQUIRE(0 == obj.size());
|
||||||
@ -227,7 +227,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
deserializeJson(doc, "{\"hello\":42}");
|
deserializeJson(doc, "{\"hello\":42}");
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(true == obj.is<int>(vla));
|
REQUIRE(true == obj.is<int>(vla));
|
||||||
}
|
}
|
||||||
@ -238,7 +238,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "hello");
|
strcpy(vla, "hello");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.createNestedArray(vla);
|
obj.createNestedArray(vla);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "hello");
|
strcpy(vla, "hello");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj.createNestedObject(vla);
|
obj.createNestedObject(vla);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -260,7 +260,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["hello"] = vla;
|
obj["hello"] = vla;
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"].as<char*>());
|
REQUIRE(std::string("world") == obj["hello"].as<char*>());
|
||||||
@ -272,7 +272,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["hello"].set(vla);
|
obj["hello"].set(vla);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == obj["hello"].as<char*>());
|
REQUIRE(std::string("world") == obj["hello"].as<char*>());
|
||||||
@ -286,7 +286,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add(vla);
|
arr.add(vla);
|
||||||
|
|
||||||
REQUIRE(std::string("world") == arr[0]);
|
REQUIRE(std::string("world") == arr[0]);
|
||||||
@ -298,7 +298,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
arr.set(0, vla);
|
arr.set(0, vla);
|
||||||
|
|
||||||
@ -313,7 +313,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
arr[0].set(vla);
|
arr[0].set(vla);
|
||||||
|
|
||||||
@ -326,7 +326,7 @@ TEST_CASE("Variable Length Array") {
|
|||||||
strcpy(vla, "world");
|
strcpy(vla, "world");
|
||||||
|
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& arr = doc.to<JsonArray>();
|
JsonArray arr = doc.to<JsonArray>();
|
||||||
arr.add("hello");
|
arr.add("hello");
|
||||||
arr[0] = vla;
|
arr[0] = vla;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ TEST_CASE("deserialize MsgPack array") {
|
|||||||
const char* input = "\x90";
|
const char* input = "\x90";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(array.size() == 0);
|
REQUIRE(array.size() == 0);
|
||||||
@ -23,7 +23,7 @@ TEST_CASE("deserialize MsgPack array") {
|
|||||||
const char* input = "\x92\x01\x02";
|
const char* input = "\x92\x01\x02";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(array.size() == 2);
|
REQUIRE(array.size() == 2);
|
||||||
@ -37,7 +37,7 @@ TEST_CASE("deserialize MsgPack array") {
|
|||||||
const char* input = "\xDC\x00\x00";
|
const char* input = "\xDC\x00\x00";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(array.size() == 0);
|
REQUIRE(array.size() == 0);
|
||||||
@ -47,7 +47,7 @@ TEST_CASE("deserialize MsgPack array") {
|
|||||||
const char* input = "\xDC\x00\x02\xA5hello\xA5world";
|
const char* input = "\xDC\x00\x02\xA5hello\xA5world";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(array.size() == 2);
|
REQUIRE(array.size() == 2);
|
||||||
@ -61,7 +61,7 @@ TEST_CASE("deserialize MsgPack array") {
|
|||||||
const char* input = "\xDD\x00\x00\x00\x00";
|
const char* input = "\xDD\x00\x00\x00\x00";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(array.size() == 0);
|
REQUIRE(array.size() == 0);
|
||||||
@ -72,7 +72,7 @@ TEST_CASE("deserialize MsgPack array") {
|
|||||||
"\xDD\x00\x00\x00\x02\xCA\x00\x00\x00\x00\xCA\x40\x48\xF5\xC3";
|
"\xDD\x00\x00\x00\x02\xCA\x00\x00\x00\x00\xCA\x40\x48\xF5\xC3";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(array.size() == 2);
|
REQUIRE(array.size() == 2);
|
||||||
|
@ -13,7 +13,7 @@ TEST_CASE("deserialize MsgPack object") {
|
|||||||
const char* input = "\x80";
|
const char* input = "\x80";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -24,7 +24,7 @@ TEST_CASE("deserialize MsgPack object") {
|
|||||||
const char* input = "\x82\xA3one\x01\xA3two\x02";
|
const char* input = "\x82\xA3one\x01\xA3two\x02";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -39,7 +39,7 @@ TEST_CASE("deserialize MsgPack object") {
|
|||||||
const char* input = "\xDE\x00\x00";
|
const char* input = "\xDE\x00\x00";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -50,7 +50,7 @@ TEST_CASE("deserialize MsgPack object") {
|
|||||||
const char* input = "\xDE\x00\x02\xA1H\xA5hello\xA1W\xA5world";
|
const char* input = "\xDE\x00\x02\xA1H\xA5hello\xA1W\xA5world";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -65,7 +65,7 @@ TEST_CASE("deserialize MsgPack object") {
|
|||||||
const char* input = "\xDF\x00\x00\x00\x00";
|
const char* input = "\xDF\x00\x00\x00\x00";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
@ -78,7 +78,7 @@ TEST_CASE("deserialize MsgPack object") {
|
|||||||
"\xF5\xC3";
|
"\xF5\xC3";
|
||||||
|
|
||||||
DeserializationError error = deserializeMsgPack(doc, input);
|
DeserializationError error = deserializeMsgPack(doc, input);
|
||||||
JsonObject& obj = doc.as<JsonObject>();
|
JsonObject obj = doc.as<JsonObject>();
|
||||||
|
|
||||||
REQUIRE(error == DeserializationError::Ok);
|
REQUIRE(error == DeserializationError::Ok);
|
||||||
REQUIRE(doc.is<JsonObject>());
|
REQUIRE(doc.is<JsonObject>());
|
||||||
|
@ -14,7 +14,7 @@ TEST_CASE("deserializeMsgPack(std::istream&)") {
|
|||||||
DeserializationError err = deserializeMsgPack(doc, input);
|
DeserializationError err = deserializeMsgPack(doc, input);
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
REQUIRE(arr[0] == 0);
|
REQUIRE(arr[0] == 0);
|
||||||
REQUIRE(arr[1] == 2);
|
REQUIRE(arr[1] == 2);
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ TEST_CASE("deserializeMsgPack(const std::string&)") {
|
|||||||
DeserializationError err = deserializeMsgPack(doc, input);
|
DeserializationError err = deserializeMsgPack(doc, input);
|
||||||
input[2] = 'X'; // alter the string tomake sure we made a copy
|
input[2] = 'X'; // alter the string tomake sure we made a copy
|
||||||
|
|
||||||
JsonArray& array = doc.as<JsonArray>();
|
JsonArray array = doc.as<JsonArray>();
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
REQUIRE(std::string("hello") == array[0]);
|
REQUIRE(std::string("hello") == array[0]);
|
||||||
}
|
}
|
||||||
@ -39,7 +39,7 @@ TEST_CASE("deserializeMsgPack(const std::string&)") {
|
|||||||
deserializeMsgPack(doc, std::string("\x92\x00\x02", 3));
|
deserializeMsgPack(doc, std::string("\x92\x00\x02", 3));
|
||||||
|
|
||||||
REQUIRE(err == DeserializationError::Ok);
|
REQUIRE(err == DeserializationError::Ok);
|
||||||
JsonArray& arr = doc.as<JsonArray>();
|
JsonArray arr = doc.as<JsonArray>();
|
||||||
REQUIRE(arr[0] == 0);
|
REQUIRE(arr[0] == 0);
|
||||||
REQUIRE(arr[1] == 2);
|
REQUIRE(arr[1] == 2);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("serialize MsgPack to various destination types") {
|
TEST_CASE("serialize MsgPack to various destination types") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject &object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
object["hello"] = "world";
|
object["hello"] = "world";
|
||||||
const char *expected_result = "\x81\xA5hello\xA5world";
|
const char *expected_result = "\x81\xA5hello\xA5world";
|
||||||
const size_t expected_length = 13;
|
const size_t expected_length = 13;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
TEST_CASE("measureMsgPack()") {
|
TEST_CASE("measureMsgPack()") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject &object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
object["hello"] = "world";
|
object["hello"] = "world";
|
||||||
|
|
||||||
REQUIRE(measureMsgPack(doc) == 13);
|
REQUIRE(measureMsgPack(doc) == 13);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
static void check(const JsonArray& array, const char* expected_data,
|
static void check(const JsonArray array, const char* expected_data,
|
||||||
size_t expected_len) {
|
size_t expected_len) {
|
||||||
std::string expected(expected_data, expected_data + expected_len);
|
std::string expected(expected_data, expected_data + expected_len);
|
||||||
std::string actual;
|
std::string actual;
|
||||||
@ -16,19 +16,19 @@ static void check(const JsonArray& array, const char* expected_data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t N>
|
template <size_t N>
|
||||||
static void check(const JsonArray& array, const char (&expected_data)[N]) {
|
static void check(const JsonArray array, const char (&expected_data)[N]) {
|
||||||
const size_t expected_len = N - 1;
|
const size_t expected_len = N - 1;
|
||||||
check(array, expected_data, expected_len);
|
check(array, expected_data, expected_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this function is used by the commented test
|
// TODO: this function is used by the commented test
|
||||||
// static void check(const JsonArray& array, const std::string& expected) {
|
// static void check(const JsonArray array, const std::string& expected) {
|
||||||
// check(array, expected.data(), expected.length());
|
// check(array, expected.data(), expected.length());
|
||||||
// }
|
// }
|
||||||
|
|
||||||
TEST_CASE("serialize MsgPack array") {
|
TEST_CASE("serialize MsgPack array") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonArray& array = doc.to<JsonArray>();
|
JsonArray array = doc.to<JsonArray>();
|
||||||
|
|
||||||
SECTION("empty") {
|
SECTION("empty") {
|
||||||
check(array, "\x90");
|
check(array, "\x90");
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
static void check(const JsonObject& object, const char* expected_data,
|
static void check(const JsonObject object, const char* expected_data,
|
||||||
size_t expected_len) {
|
size_t expected_len) {
|
||||||
std::string expected(expected_data, expected_data + expected_len);
|
std::string expected(expected_data, expected_data + expected_len);
|
||||||
std::string actual;
|
std::string actual;
|
||||||
@ -17,19 +17,19 @@ static void check(const JsonObject& object, const char* expected_data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t N>
|
template <size_t N>
|
||||||
static void check(const JsonObject& object, const char (&expected_data)[N]) {
|
static void check(const JsonObject object, const char (&expected_data)[N]) {
|
||||||
const size_t expected_len = N - 1;
|
const size_t expected_len = N - 1;
|
||||||
check(object, expected_data, expected_len);
|
check(object, expected_data, expected_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: used by the commented test
|
// TODO: used by the commented test
|
||||||
// static void check(const JsonObject& object, const std::string& expected) {
|
// static void check(const JsonObject object, const std::string& expected) {
|
||||||
// check(object, expected.data(), expected.length());
|
// check(object, expected.data(), expected.length());
|
||||||
//}
|
//}
|
||||||
|
|
||||||
TEST_CASE("serialize MsgPack object") {
|
TEST_CASE("serialize MsgPack object") {
|
||||||
DynamicJsonDocument doc;
|
DynamicJsonDocument doc;
|
||||||
JsonObject& object = doc.to<JsonObject>();
|
JsonObject object = doc.to<JsonObject>();
|
||||||
|
|
||||||
SECTION("empty") {
|
SECTION("empty") {
|
||||||
check(object, "\x80");
|
check(object, "\x80");
|
||||||
|
Reference in New Issue
Block a user