mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 00:32:37 +01:00 
			
		
		
		
	Replaced printTo() with serializeJson()
				
					
				
			* Added `serializeJson()` and `serializeJsonPretty()` * Added `measureJson()` and `measureJsonPretty()` * Removed `printTo()` and `prettyPrintTo()` * Removed `measureLength()` and `measurePrettyLength()`
This commit is contained in:
		
							
								
								
									
										18
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -4,12 +4,16 @@ ArduinoJson: change log | ||||
| HEAD | ||||
| ---- | ||||
|  | ||||
| * Added DynamicJsonArray and StaticJsonArray | ||||
| * Added DynamicJsonObject and StaticJsonObject | ||||
| * Added DynamicJsonVariant and StaticJsonVariant | ||||
| * Added deserializeJson() | ||||
| * Removed JsonBuffer::parseArray(), parseObject() and parse() | ||||
| * Removed JsonBuffer::createArray() and createObject() | ||||
| * Added `DynamicJsonArray` and `StaticJsonArray` | ||||
| * Added `DynamicJsonObject` and `StaticJsonObject` | ||||
| * Added `DynamicJsonVariant` and `StaticJsonVariant` | ||||
| * Added `deserializeJson()` | ||||
| * Added `serializeJson()` and `serializeJsonPretty()` | ||||
| * Added `measureJson()` and `measureJsonPretty()` | ||||
| * Removed `JsonBuffer::parseArray()`, `parseObject()` and `parse()` | ||||
| * Removed `JsonBuffer::createArray()` and `createObject()` | ||||
| * Removed `printTo()` and `prettyPrintTo()` | ||||
| * Removed `measureLength()` and `measurePrettyLength()` | ||||
|  | ||||
| > ### BREAKING CHANGES | ||||
| >  | ||||
| @@ -51,7 +55,7 @@ HEAD | ||||
| > ```c++ | ||||
| > DynamicJsonObject obj; | ||||
| > obj["key"] = "value"; | ||||
| > obj.printTo(Serial); | ||||
| > serializeJson(obj, Serial); | ||||
| > ``` | ||||
|  | ||||
| v5.13.1 | ||||
|   | ||||
| @@ -60,7 +60,7 @@ Here is a program that parses a JSON document with ArduinoJson. | ||||
| char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; | ||||
|  | ||||
| DynamicJsonObject root; | ||||
| derserializeJson(root, json); | ||||
| deserializeJson(root, json); | ||||
|  | ||||
| const char* sensor = root["sensor"]; | ||||
| long time          = root["time"]; | ||||
| @@ -83,7 +83,7 @@ JsonArray& data = root.createNestedArray("data"); | ||||
| data.add(48.756080); | ||||
| data.add(2.302038); | ||||
|  | ||||
| root.printTo(Serial); | ||||
| serializeJson(root, Serial); | ||||
| // This prints: | ||||
| // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} | ||||
| ``` | ||||
|   | ||||
| @@ -72,7 +72,7 @@ void saveConfiguration(const char *filename, const Config &config) { | ||||
|   root["port"] = config.port; | ||||
|  | ||||
|   // Serialize JSON to file | ||||
|   if (root.printTo(file) == 0) { | ||||
|   if (serializeJson(root, file) == 0) { | ||||
|     Serial.println(F("Failed to write to file")); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -38,13 +38,13 @@ void setup() { | ||||
|   data.add(48.756080); | ||||
|   data.add(2.302038); | ||||
|  | ||||
|   root.printTo(Serial); | ||||
|   serializeJson(root, Serial); | ||||
|   // This prints: | ||||
|   // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} | ||||
|  | ||||
|   Serial.println(); | ||||
|  | ||||
|   root.prettyPrintTo(Serial); | ||||
|   serializeJsonPretty(root, Serial); | ||||
|   // This prints: | ||||
|   // { | ||||
|   //   "sensor": "gps", | ||||
|   | ||||
| @@ -76,7 +76,7 @@ void loop() { | ||||
|   } | ||||
|  | ||||
|   Serial.print(F("Sending: ")); | ||||
|   root.printTo(Serial); | ||||
|   serializeJson(root, Serial); | ||||
|   Serial.println(); | ||||
|  | ||||
|   // Write response headers | ||||
| @@ -86,7 +86,7 @@ void loop() { | ||||
|   client.println(); | ||||
|  | ||||
|   // Write JSON document | ||||
|   root.prettyPrintTo(client); | ||||
|   serializeJsonPretty(root, client); | ||||
|  | ||||
|   // Disconnect | ||||
|   client.stop(); | ||||
|   | ||||
| @@ -72,11 +72,11 @@ void loop() { | ||||
|   Serial.print(remoteIp); | ||||
|   Serial.print(F(" on port ")); | ||||
|   Serial.println(remotePort); | ||||
|   root.printTo(Serial); | ||||
|   serializeJson(root, Serial); | ||||
|  | ||||
|   // Send UDP packet | ||||
|   udp.beginPacket(remoteIp, remotePort); | ||||
|   root.printTo(udp); | ||||
|   serializeJson(root, udp); | ||||
|   udp.println(); | ||||
|   udp.endPacket(); | ||||
|  | ||||
|   | ||||
| @@ -54,7 +54,7 @@ void setup() { | ||||
|  | ||||
|   // Lastly, you can print the resulting JSON to a String | ||||
|   String output; | ||||
|   root.printTo(output); | ||||
|   serializeJson(root, output); | ||||
| } | ||||
|  | ||||
| void loop() { | ||||
|   | ||||
							
								
								
									
										25
									
								
								keywords.txt
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								keywords.txt
									
									
									
									
									
								
							| @@ -1,13 +1,18 @@ | ||||
| add	KEYWORD2 | ||||
| as	KEYWORD2 | ||||
| createNestedArray	KEYWORD2 | ||||
| createNestedObject	KEYWORD2 | ||||
| deserializeJson	KEYWORD2 | ||||
| DynamicJsonArray	KEYWORD1 | ||||
| DynamicJsonObject	KEYWORD1 | ||||
| DynamicJsonVariant	KEYWORD1 | ||||
| get	KEYWORD2 | ||||
| JsonArray	KEYWORD1 | ||||
| JsonObject	KEYWORD1 | ||||
| JsonVariant	KEYWORD1 | ||||
| StaticJsonBuffer	KEYWORD1 | ||||
| DynamicJsonBuffer	KEYWORD1 | ||||
| add	KEYWORD2 | ||||
| createNestedArray	KEYWORD2 | ||||
| createNestedObject	KEYWORD2 | ||||
| parseArray	KEYWORD2 | ||||
| parseObject	KEYWORD2 | ||||
| prettyPrintTo	KEYWORD2 | ||||
| printTo	KEYWORD2 | ||||
| success	KEYWORD2 | ||||
| serializeJson	KEYWORD2 | ||||
| serializeJsonPretty	KEYWORD2 | ||||
| set	KEYWORD2 | ||||
| StaticJsonArray	KEYWORD1 | ||||
| StaticJsonObject	KEYWORD1 | ||||
| StaticJsonVariant	KEYWORD1 | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "../Data/Encoding.hpp" | ||||
| #include "Comments.hpp" | ||||
| #include "JsonParser.hpp" | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,6 @@ | ||||
| #include "Data/ReferenceType.hpp" | ||||
| #include "Data/ValueSaver.hpp" | ||||
| #include "JsonVariant.hpp" | ||||
| #include "Serialization/JsonPrintable.hpp" | ||||
| #include "StringTraits/StringTraits.hpp" | ||||
| #include "TypeTraits/EnableIf.hpp" | ||||
| #include "TypeTraits/IsArray.hpp" | ||||
| @@ -30,8 +29,7 @@ namespace Internals { | ||||
| class JsonArraySubscript; | ||||
| } | ||||
|  | ||||
| class JsonArray : public Internals::JsonPrintable<JsonArray>, | ||||
|                   public Internals::ReferenceType, | ||||
| class JsonArray : public Internals::ReferenceType, | ||||
|                   public Internals::NonCopyable, | ||||
|                   public Internals::List<JsonVariant>, | ||||
|                   public Internals::JsonBufferAllocated { | ||||
|   | ||||
| @@ -98,14 +98,7 @@ inline const JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[]( | ||||
|     size_t index) const { | ||||
|   return impl()->template as<JsonArray>()[index]; | ||||
| } | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| inline std::ostream& operator<<(std::ostream& os, | ||||
|                                 const JsonArraySubscript& source) { | ||||
|   return source.printTo(os); | ||||
| } | ||||
| #endif | ||||
| } | ||||
| }  // namespace Internals | ||||
|  | ||||
| inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) { | ||||
|   return Internals::JsonArraySubscript(*this, index); | ||||
| @@ -115,7 +108,7 @@ inline const Internals::JsonArraySubscript JsonArray::operator[]( | ||||
|     size_t index) const { | ||||
|   return Internals::JsonArraySubscript(*const_cast<JsonArray*>(this), index); | ||||
| } | ||||
| } | ||||
| }  // namespace ArduinoJson | ||||
|  | ||||
| #ifdef _MSC_VER | ||||
| #pragma warning(pop) | ||||
|   | ||||
| @@ -9,7 +9,6 @@ | ||||
| #include "Data/ReferenceType.hpp" | ||||
| #include "Data/ValueSaver.hpp" | ||||
| #include "JsonPair.hpp" | ||||
| #include "Serialization/JsonPrintable.hpp" | ||||
| #include "StringTraits/StringTraits.hpp" | ||||
| #include "TypeTraits/EnableIf.hpp" | ||||
| #include "TypeTraits/IsArray.hpp" | ||||
| @@ -31,8 +30,7 @@ template <typename> | ||||
| class JsonObjectSubscript; | ||||
| } | ||||
|  | ||||
| class JsonObject : public Internals::JsonPrintable<JsonObject>, | ||||
|                    public Internals::ReferenceType, | ||||
| class JsonObject : public Internals::ReferenceType, | ||||
|                    public Internals::NonCopyable, | ||||
|                    public Internals::List<JsonPair>, | ||||
|                    public Internals::JsonBufferAllocated { | ||||
|   | ||||
| @@ -94,16 +94,8 @@ class JsonObjectSubscript | ||||
|   JsonObject& _object; | ||||
|   TStringRef _key; | ||||
| }; | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| template <typename TStringRef> | ||||
| inline std::ostream& operator<<(std::ostream& os, | ||||
|                                 const JsonObjectSubscript<TStringRef>& source) { | ||||
|   return source.printTo(os); | ||||
| } | ||||
| #endif | ||||
| } | ||||
| } | ||||
| }  // namespace Internals | ||||
| }  // namespace ArduinoJson | ||||
|  | ||||
| #ifdef _MSC_VER | ||||
| #pragma warning(pop) | ||||
|   | ||||
| @@ -12,7 +12,6 @@ | ||||
| #include "Data/JsonVariantType.hpp" | ||||
| #include "JsonVariantBase.hpp" | ||||
| #include "RawJson.hpp" | ||||
| #include "Serialization/JsonPrintable.hpp" | ||||
| #include "TypeTraits/EnableIf.hpp" | ||||
| #include "TypeTraits/IsChar.hpp" | ||||
| #include "TypeTraits/IsFloatingPoint.hpp" | ||||
| @@ -28,6 +27,10 @@ namespace ArduinoJson { | ||||
| // Forward declarations. | ||||
| class JsonArray; | ||||
| class JsonObject; | ||||
| namespace Internals { | ||||
| template <typename Print> | ||||
| class JsonSerializer; | ||||
| } | ||||
|  | ||||
| // A variant that can be a any value serializable to a JSON value. | ||||
| // | ||||
| @@ -194,7 +197,7 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> { | ||||
|     const char *cstr = variantAsString(); | ||||
|     if (cstr) return T(cstr); | ||||
|     T s; | ||||
|     printTo(s); | ||||
|     serializeJson(*this, s); | ||||
|     return s; | ||||
|   } | ||||
|   // | ||||
|   | ||||
| @@ -8,17 +8,15 @@ | ||||
| #include "JsonVariantComparisons.hpp" | ||||
| #include "JsonVariantOr.hpp" | ||||
| #include "JsonVariantSubscripts.hpp" | ||||
| #include "Serialization/JsonPrintable.hpp" | ||||
|  | ||||
| namespace ArduinoJson { | ||||
| namespace Internals { | ||||
|  | ||||
| template <typename TImpl> | ||||
| class JsonVariantBase : public JsonPrintable<TImpl>, | ||||
|                         public JsonVariantCasts<TImpl>, | ||||
| class JsonVariantBase : public JsonVariantCasts<TImpl>, | ||||
|                         public JsonVariantComparisons<TImpl>, | ||||
|                         public JsonVariantOr<TImpl>, | ||||
|                         public JsonVariantSubscripts<TImpl>, | ||||
|                         public JsonVariantTag {}; | ||||
| } | ||||
| } | ||||
| }  // namespace Internals | ||||
| }  // namespace ArduinoJson | ||||
|   | ||||
| @@ -117,10 +117,4 @@ inline bool JsonVariant::variantIsFloat() const { | ||||
|          (_type == JSON_UNPARSED && isFloat(_content.asString)); | ||||
| } | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) { | ||||
|   return source.printTo(os); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| }  // namespace ArduinoJson | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| namespace ArduinoJson { | ||||
| namespace Internals { | ||||
|  | ||||
| // A dummy Print implementation used in JsonPrintable::measureLength() | ||||
| // A dummy Print implementation used in measureJson() | ||||
| class DummyPrint { | ||||
|  public: | ||||
|   size_t print(char) { | ||||
| @@ -18,5 +18,5 @@ class DummyPrint { | ||||
|     return strlen(s); | ||||
|   } | ||||
| }; | ||||
| } | ||||
| } | ||||
| }  // namespace Internals | ||||
| }  // namespace ArduinoJson | ||||
|   | ||||
| @@ -8,7 +8,7 @@ namespace ArduinoJson { | ||||
| namespace Internals { | ||||
|  | ||||
| // Decorator on top of Print to allow indented output. | ||||
| // This class is used by JsonPrintable::prettyPrintTo() but can also be used | ||||
| // This class is used by serializeJsonPretty() but can also be used | ||||
| // for your own purpose, like logging. | ||||
| template <typename Print> | ||||
| class IndentedPrint { | ||||
| @@ -64,5 +64,5 @@ class IndentedPrint { | ||||
|   static const int MAX_LEVEL = 15;    // because it's only 4 bits | ||||
|   static const int MAX_TAB_SIZE = 7;  // because it's only 3 bits | ||||
| }; | ||||
| } | ||||
| } | ||||
| }  // namespace Internals | ||||
| }  // namespace ArduinoJson | ||||
|   | ||||
| @@ -1,117 +0,0 @@ | ||||
| // ArduinoJson - arduinojson.org | ||||
| // Copyright Benoit Blanchon 2014-2018 | ||||
| // MIT License | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "../Configuration.hpp" | ||||
| #include "../TypeTraits/EnableIf.hpp" | ||||
| #include "DummyPrint.hpp" | ||||
| #include "DynamicStringBuilder.hpp" | ||||
| #include "IndentedPrint.hpp" | ||||
| #include "JsonSerializer.hpp" | ||||
| #include "JsonWriter.hpp" | ||||
| #include "Prettyfier.hpp" | ||||
| #include "StaticStringBuilder.hpp" | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| #include "StreamPrintAdapter.hpp" | ||||
| #endif | ||||
|  | ||||
| namespace ArduinoJson { | ||||
| namespace Internals { | ||||
|  | ||||
| // Implements all the overloads of printTo() and prettyPrintTo() | ||||
| // Caution: this class use a template parameter to avoid virtual methods. | ||||
| // This is a bit curious but allows to reduce the size of JsonVariant, JsonArray | ||||
| // and JsonObject. | ||||
| template <typename T> | ||||
| class JsonPrintable { | ||||
|  public: | ||||
|   template <typename Print> | ||||
|   typename EnableIf<!StringTraits<Print>::has_append, size_t>::type printTo( | ||||
|       Print &print) const { | ||||
|     JsonWriter<Print> writer(print); | ||||
|     JsonSerializer<JsonWriter<Print> >::serialize(downcast(), writer); | ||||
|     return writer.bytesWritten(); | ||||
|   } | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
|   std::ostream &printTo(std::ostream &os) const { | ||||
|     StreamPrintAdapter adapter(os); | ||||
|     printTo(adapter); | ||||
|     return os; | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   size_t printTo(char *buffer, size_t bufferSize) const { | ||||
|     StaticStringBuilder sb(buffer, bufferSize); | ||||
|     return printTo(sb); | ||||
|   } | ||||
|  | ||||
|   template <size_t N> | ||||
|   size_t printTo(char (&buffer)[N]) const { | ||||
|     return printTo(buffer, N); | ||||
|   } | ||||
|  | ||||
|   template <typename TString> | ||||
|   typename EnableIf<StringTraits<TString>::has_append, size_t>::type printTo( | ||||
|       TString &str) const { | ||||
|     DynamicStringBuilder<TString> sb(str); | ||||
|     return printTo(sb); | ||||
|   } | ||||
|  | ||||
|   template <typename Print> | ||||
|   size_t prettyPrintTo(IndentedPrint<Print> &print) const { | ||||
|     Prettyfier<Print> p(print); | ||||
|     return printTo(p); | ||||
|   } | ||||
|  | ||||
|   size_t prettyPrintTo(char *buffer, size_t bufferSize) const { | ||||
|     StaticStringBuilder sb(buffer, bufferSize); | ||||
|     return prettyPrintTo(sb); | ||||
|   } | ||||
|  | ||||
|   template <size_t N> | ||||
|   size_t prettyPrintTo(char (&buffer)[N]) const { | ||||
|     return prettyPrintTo(buffer, N); | ||||
|   } | ||||
|  | ||||
|   template <typename Print> | ||||
|   typename EnableIf<!StringTraits<Print>::has_append, size_t>::type | ||||
|   prettyPrintTo(Print &print) const { | ||||
|     IndentedPrint<Print> indentedPrint(print); | ||||
|     return prettyPrintTo(indentedPrint); | ||||
|   } | ||||
|  | ||||
|   template <typename TString> | ||||
|   typename EnableIf<StringTraits<TString>::has_append, size_t>::type | ||||
|   prettyPrintTo(TString &str) const { | ||||
|     DynamicStringBuilder<TString> sb(str); | ||||
|     return prettyPrintTo(sb); | ||||
|   } | ||||
|  | ||||
|   size_t measureLength() const { | ||||
|     DummyPrint dp; | ||||
|     return printTo(dp); | ||||
|   } | ||||
|  | ||||
|   size_t measurePrettyLength() const { | ||||
|     DummyPrint dp; | ||||
|     return prettyPrintTo(dp); | ||||
|   } | ||||
|  | ||||
|  private: | ||||
|   const T &downcast() const { | ||||
|     return *static_cast<const T *>(this); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| template <typename T> | ||||
| inline std::ostream &operator<<(std::ostream &os, const JsonPrintable<T> &v) { | ||||
|   return v.printTo(os); | ||||
| } | ||||
| #endif | ||||
| } | ||||
| } | ||||
| @@ -4,7 +4,16 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "DummyPrint.hpp" | ||||
| #include "DynamicStringBuilder.hpp" | ||||
| #include "IndentedPrint.hpp" | ||||
| #include "JsonWriter.hpp" | ||||
| #include "Prettyfier.hpp" | ||||
| #include "StaticStringBuilder.hpp" | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| #include "StreamPrintAdapter.hpp" | ||||
| #endif | ||||
|  | ||||
| namespace ArduinoJson { | ||||
|  | ||||
| @@ -28,5 +37,122 @@ class JsonSerializer { | ||||
|   static void serialize(const JsonObjectSubscript<TKey> &, Writer &); | ||||
|   static void serialize(const JsonVariant &, Writer &); | ||||
| }; | ||||
| }  // namespace Internals | ||||
|  | ||||
| template <typename TSource, typename TDestination> | ||||
| typename Internals::EnableIf<!Internals::StringTraits<TDestination>::has_append, | ||||
|                              size_t>::type | ||||
| serializeJson(const TSource &source, TDestination &destination) { | ||||
|   Internals::JsonWriter<TDestination> writer(destination); | ||||
|   Internals::JsonSerializer<Internals::JsonWriter<TDestination> >::serialize( | ||||
|       source, writer); | ||||
|   return writer.bytesWritten(); | ||||
| } | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| template <typename TSource> | ||||
| std::ostream &serializeJson(const TSource &source, std::ostream &os) { | ||||
|   Internals::StreamPrintAdapter adapter(os); | ||||
|   serializeJson(source, adapter); | ||||
|   return os; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| template <typename TSource> | ||||
| size_t serializeJson(const TSource &source, char *buffer, size_t bufferSize) { | ||||
|   Internals::StaticStringBuilder sb(buffer, bufferSize); | ||||
|   return serializeJson(source, sb); | ||||
| } | ||||
|  | ||||
| template <typename TSource, size_t N> | ||||
| size_t serializeJson(const TSource &source, char (&buffer)[N]) { | ||||
|   return serializeJson(source, buffer, N); | ||||
| } | ||||
|  | ||||
| template <typename TSource, typename TDestination> | ||||
| typename Internals::EnableIf<Internals::StringTraits<TDestination>::has_append, | ||||
|                              size_t>::type | ||||
| serializeJson(const TSource &source, TDestination &str) { | ||||
|   Internals::DynamicStringBuilder<TDestination> sb(str); | ||||
|   return serializeJson(source, sb); | ||||
| } | ||||
|  | ||||
| template <typename TSource, typename TDestination> | ||||
| size_t serializeJsonPretty(const TSource &source, | ||||
|                            Internals::IndentedPrint<TDestination> &print) { | ||||
|   Internals::Prettyfier<TDestination> p(print); | ||||
|   return serializeJson(source, p); | ||||
| } | ||||
|  | ||||
| template <typename TSource> | ||||
| size_t serializeJsonPretty(const TSource &source, char *buffer, | ||||
|                            size_t bufferSize) { | ||||
|   Internals::StaticStringBuilder sb(buffer, bufferSize); | ||||
|   return serializeJsonPretty(source, sb); | ||||
| } | ||||
|  | ||||
| template <typename TSource, size_t N> | ||||
| size_t serializeJsonPretty(const TSource &source, char (&buffer)[N]) { | ||||
|   return serializeJsonPretty(source, buffer, N); | ||||
| } | ||||
|  | ||||
| template <typename TSource, typename TDestination> | ||||
| typename Internals::EnableIf<!Internals::StringTraits<TDestination>::has_append, | ||||
|                              size_t>::type | ||||
| serializeJsonPretty(const TSource &source, TDestination &print) { | ||||
|   Internals::IndentedPrint<TDestination> indentedPrint(print); | ||||
|   return serializeJsonPretty(source, indentedPrint); | ||||
| } | ||||
|  | ||||
| template <typename TSource, typename TDestination> | ||||
| typename Internals::EnableIf<Internals::StringTraits<TDestination>::has_append, | ||||
|                              size_t>::type | ||||
| serializeJsonPretty(const TSource &source, TDestination &str) { | ||||
|   Internals::DynamicStringBuilder<TDestination> sb(str); | ||||
|   return serializeJsonPretty(source, sb); | ||||
| } | ||||
|  | ||||
| template <typename TSource> | ||||
| size_t measureJson(const TSource &source) { | ||||
|   Internals::DummyPrint dp; | ||||
|   return serializeJson(source, dp); | ||||
| } | ||||
|  | ||||
| template <typename TSource> | ||||
| size_t measureJsonPretty(const TSource &source) { | ||||
|   Internals::DummyPrint dp; | ||||
|   return serializeJsonPretty(source, dp); | ||||
| } | ||||
|  | ||||
| #if ARDUINOJSON_ENABLE_STD_STREAM | ||||
| inline std::ostream &operator<<(std::ostream &os, const JsonArray &source) { | ||||
|   serializeJson(source, os); | ||||
|   return os; | ||||
| } | ||||
| inline std::ostream &operator<<(std::ostream &os, const JsonObject &source) { | ||||
|   serializeJson(source, os); | ||||
|   return os; | ||||
| } | ||||
| inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) { | ||||
|   serializeJson(source, os); | ||||
|   return os; | ||||
| } | ||||
|  | ||||
| namespace Internals { | ||||
| inline std::ostream &operator<<(std::ostream &os, | ||||
|                                 const JsonArraySubscript &source) { | ||||
|   serializeJson(source, os); | ||||
|   return os; | ||||
| } | ||||
|  | ||||
| template <typename TKey> | ||||
| inline std::ostream &operator<<(std::ostream &os, | ||||
|                                 const JsonObjectSubscript<TKey> &source) { | ||||
|   serializeJson(source, os); | ||||
|   return os; | ||||
| } | ||||
| }  // namespace Internals | ||||
|  | ||||
| #endif | ||||
|  | ||||
| }  // namespace ArduinoJson | ||||
|   | ||||
| @@ -26,8 +26,6 @@ class JsonWriter { | ||||
|   explicit JsonWriter(Print &sink) : _sink(sink), _length(0) {} | ||||
|  | ||||
|   // Returns the number of bytes sent to the Print implementation. | ||||
|   // This is very handy for implementations of printTo() that must return the | ||||
|   // number of bytes written. | ||||
|   size_t bytesWritten() const { | ||||
|     return _length; | ||||
|   } | ||||
| @@ -151,5 +149,5 @@ class JsonWriter { | ||||
|  private: | ||||
|   JsonWriter &operator=(const JsonWriter &);  // cannot be assigned | ||||
| }; | ||||
| } | ||||
| } | ||||
| }  // namespace Internals | ||||
| }  // namespace ArduinoJson | ||||
|   | ||||
| @@ -69,6 +69,7 @@ add_subdirectory(IntegrationTests) | ||||
| add_subdirectory(JsonArray) | ||||
| add_subdirectory(JsonObject) | ||||
| add_subdirectory(JsonParser) | ||||
| add_subdirectory(JsonSerializer) | ||||
| add_subdirectory(JsonVariant) | ||||
| add_subdirectory(JsonWriter) | ||||
| add_subdirectory(Misc) | ||||
|   | ||||
| @@ -18,7 +18,8 @@ std::stringstream allocatorLog; | ||||
|  | ||||
| struct SpyingAllocator : DefaultAllocator { | ||||
|   void* allocate(size_t n) { | ||||
|     allocatorLog << "A" << (n - DynamicJsonBuffer::EmptyBlockSize); | ||||
|     allocatorLog << static_cast<const char*>("A") | ||||
|                  << (n - DynamicJsonBuffer::EmptyBlockSize); | ||||
|     return DefaultAllocator::allocate(n); | ||||
|   } | ||||
|   void deallocate(void* p) { | ||||
|   | ||||
| @@ -10,11 +10,11 @@ void check(std::string originalJson) { | ||||
|  | ||||
|   std::string prettyJson; | ||||
|   deserializeJson(obj, originalJson); | ||||
|   obj.prettyPrintTo(prettyJson); | ||||
|   serializeJsonPretty(obj, prettyJson); | ||||
|  | ||||
|   std::string finalJson; | ||||
|   deserializeJson(obj, originalJson); | ||||
|   obj.printTo(finalJson); | ||||
|   serializeJson(obj, finalJson); | ||||
|  | ||||
|   REQUIRE(originalJson == finalJson); | ||||
| } | ||||
|   | ||||
| @@ -9,8 +9,6 @@ add_executable(JsonArrayTests | ||||
| 	copyTo.cpp | ||||
| 	invalid.cpp | ||||
| 	iterator.cpp | ||||
| 	prettyPrintTo.cpp | ||||
| 	printTo.cpp | ||||
| 	remove.cpp | ||||
| 	set.cpp | ||||
| 	size.cpp | ||||
|   | ||||
| @@ -14,7 +14,7 @@ TEST_CASE("JsonArray::copyFrom()") { | ||||
|     bool ok = array.copyFrom(source); | ||||
|     REQUIRE(ok); | ||||
|  | ||||
|     array.printTo(json, sizeof(json)); | ||||
|     serializeJson(array, json, sizeof(json)); | ||||
|     REQUIRE(std::string("[1,2,3]") == json); | ||||
|   } | ||||
|  | ||||
| @@ -27,7 +27,7 @@ TEST_CASE("JsonArray::copyFrom()") { | ||||
|     bool ok = array.copyFrom(source); | ||||
|     REQUIRE_FALSE(ok); | ||||
|  | ||||
|     array.printTo(json, sizeof(json)); | ||||
|     serializeJson(array, json, sizeof(json)); | ||||
|     REQUIRE(std::string("[1,2]") == json); | ||||
|   } | ||||
|  | ||||
| @@ -39,7 +39,7 @@ TEST_CASE("JsonArray::copyFrom()") { | ||||
|     bool ok = array.copyFrom(source); | ||||
|     REQUIRE(ok); | ||||
|  | ||||
|     array.printTo(json, sizeof(json)); | ||||
|     serializeJson(array, json, sizeof(json)); | ||||
|     REQUIRE(std::string("[[1,2,3],[4,5,6]]") == json); | ||||
|   } | ||||
|  | ||||
| @@ -53,7 +53,7 @@ TEST_CASE("JsonArray::copyFrom()") { | ||||
|     bool ok = array.copyFrom(source); | ||||
|     REQUIRE_FALSE(ok); | ||||
|  | ||||
|     array.printTo(json, sizeof(json)); | ||||
|     serializeJson(array, json, sizeof(json)); | ||||
|     REQUIRE(std::string("[[1,2,3],[4,5]]") == json); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -28,7 +28,7 @@ TEST_CASE("JsonArray::invalid()") { | ||||
|  | ||||
|   SECTION("PrintToWritesBrackets") { | ||||
|     char buffer[32]; | ||||
|     JsonArray::invalid().printTo(buffer, sizeof(buffer)); | ||||
|     serializeJson(JsonArray::invalid(), buffer, sizeof(buffer)); | ||||
|     REQUIRE_THAT(buffer, Equals("[]")); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -8,8 +8,6 @@ add_executable(JsonObjectTests | ||||
| 	get.cpp | ||||
| 	invalid.cpp | ||||
| 	iterator.cpp | ||||
| 	prettyPrintTo.cpp | ||||
| 	printTo.cpp | ||||
| 	remove.cpp | ||||
| 	set.cpp | ||||
| 	size.cpp | ||||
|   | ||||
| @@ -29,7 +29,7 @@ TEST_CASE("JsonObject::invalid()") { | ||||
|  | ||||
|   SECTION("PrintToWritesBraces") { | ||||
|     char buffer[32]; | ||||
|     obj.printTo(buffer, sizeof(buffer)); | ||||
|     serializeJson(obj, buffer, sizeof(buffer)); | ||||
|     REQUIRE_THAT(buffer, Equals("{}")); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -33,7 +33,7 @@ TEST_CASE("JsonObject::remove()") { | ||||
|     } | ||||
|  | ||||
|     std::string result; | ||||
|     obj.printTo(result); | ||||
|     serializeJson(obj, result); | ||||
|     REQUIRE("{\"a\":0,\"c\":2}" == result); | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										14
									
								
								test/JsonSerializer/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								test/JsonSerializer/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # ArduinoJson - arduinojson.org | ||||
| # Copyright Benoit Blanchon 2014-2018 | ||||
| # MIT License | ||||
|  | ||||
| add_executable(JsonSerializerTests | ||||
| 	JsonArray.cpp | ||||
| 	JsonArrayPretty.cpp | ||||
| 	JsonObject.cpp | ||||
| 	JsonObjectPretty.cpp | ||||
| 	JsonVariant.cpp | ||||
| ) | ||||
|  | ||||
| target_link_libraries(JsonSerializerTests catch) | ||||
| add_test(JsonSerializer JsonSerializerTests) | ||||
| @@ -7,14 +7,14 @@ | ||||
| 
 | ||||
| static void check(JsonArray &array, std::string expected) { | ||||
|   std::string actual; | ||||
|   size_t actualLen = array.printTo(actual); | ||||
|   size_t actualLen = serializeJson(array, actual); | ||||
|   REQUIRE(expected == actual); | ||||
|   REQUIRE(actualLen == expected.size()); | ||||
|   size_t measuredLen = array.measureLength(); | ||||
|   size_t measuredLen = measureJson(array); | ||||
|   REQUIRE(measuredLen == expected.size()); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE("JsonArray::printTo()") { | ||||
| TEST_CASE("serializeJson(JsonArray)") { | ||||
|   StaticJsonArray<JSON_ARRAY_SIZE(2)> array; | ||||
| 
 | ||||
|   SECTION("Empty") { | ||||
| @@ -7,14 +7,14 @@ | ||||
| 
 | ||||
| static void check(JsonArray& array, std::string expected) { | ||||
|   std::string actual; | ||||
|   size_t actualLen = array.prettyPrintTo(actual); | ||||
|   size_t measuredLen = array.measurePrettyLength(); | ||||
|   size_t actualLen = serializeJsonPretty(array, actual); | ||||
|   size_t measuredLen = measureJsonPretty(array); | ||||
|   CHECK(actualLen == expected.size()); | ||||
|   CHECK(measuredLen == expected.size()); | ||||
|   REQUIRE(expected == actual); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE("JsonArray::prettyPrintTo()") { | ||||
| TEST_CASE("serializeJsonPretty(JsonArray)") { | ||||
|   DynamicJsonArray array; | ||||
| 
 | ||||
|   SECTION("Empty") { | ||||
| @@ -8,14 +8,15 @@ | ||||
| 
 | ||||
| void check(const JsonObject &obj, const std::string &expected) { | ||||
|   char actual[256]; | ||||
|   size_t actualLen = obj.printTo(actual); | ||||
|   size_t measuredLen = obj.measureLength(); | ||||
|   size_t actualLen = serializeJson(obj, actual); | ||||
|   size_t measuredLen = measureJson(obj); | ||||
| 
 | ||||
|   REQUIRE(expected == actual); | ||||
|   REQUIRE(expected.size() == actualLen); | ||||
|   REQUIRE(expected.size() == measuredLen); | ||||
| } | ||||
| TEST_CASE("JsonObject::printTo()") { | ||||
| 
 | ||||
| TEST_CASE("serializeJson(JsonObject)") { | ||||
|   DynamicJsonObject obj; | ||||
| 
 | ||||
|   SECTION("EmptyObject") { | ||||
| @@ -9,15 +9,15 @@ | ||||
| void check(const JsonObject &obj, const std::string expected) { | ||||
|   char json[256]; | ||||
| 
 | ||||
|   size_t actualLen = obj.prettyPrintTo(json); | ||||
|   size_t measuredLen = obj.measurePrettyLength(); | ||||
|   size_t actualLen = serializeJsonPretty(obj, json); | ||||
|   size_t measuredLen = measureJsonPretty(obj); | ||||
| 
 | ||||
|   REQUIRE(json == expected); | ||||
|   REQUIRE(expected.size() == actualLen); | ||||
|   REQUIRE(expected.size() == measuredLen); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE("JsonObject::prettyPrintTo()") { | ||||
| TEST_CASE("serializeJsonPretty(JsonObject)") { | ||||
|   DynamicJsonObject obj; | ||||
| 
 | ||||
|   SECTION("EmptyObject") { | ||||
| @@ -8,12 +8,12 @@ | ||||
| 
 | ||||
| void check(JsonVariant variant, const std::string &expected) { | ||||
|   char buffer[256] = ""; | ||||
|   size_t returnValue = variant.printTo(buffer, sizeof(buffer)); | ||||
|   size_t returnValue = serializeJson(variant, buffer, sizeof(buffer)); | ||||
|   REQUIRE(expected == buffer); | ||||
|   REQUIRE(expected.size() == returnValue); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE("JsonVariant::printTo()") { | ||||
| TEST_CASE("serializeJson(JsonVariant)") { | ||||
|   SECTION("Empty") { | ||||
|     check(JsonVariant(), ""); | ||||
|   } | ||||
| @@ -2,13 +2,12 @@ | ||||
| # Copyright Benoit Blanchon 2014-2018 | ||||
| # MIT License | ||||
|  | ||||
| add_executable(JsonVariantTests  | ||||
| add_executable(JsonVariantTests | ||||
| 	as.cpp | ||||
| 	compare.cpp | ||||
| 	copy.cpp | ||||
| 	is.cpp | ||||
| 	or.cpp | ||||
| 	printTo.cpp | ||||
| 	set_get.cpp | ||||
| 	subscript.cpp | ||||
| 	success.cpp | ||||
|   | ||||
| @@ -49,19 +49,19 @@ TEST_CASE("std::string") { | ||||
|       REQUIRE(std::string("world") == array[0]); | ||||
|     } | ||||
|  | ||||
|     SECTION("printTo()") { | ||||
|     SECTION("serializeJson()") { | ||||
|       array.add(4); | ||||
|       array.add(2); | ||||
|       std::string json; | ||||
|       array.printTo(json); | ||||
|       serializeJson(array, json); | ||||
|       REQUIRE(std::string("[4,2]") == json); | ||||
|     } | ||||
|  | ||||
|     SECTION("prettyPrintTo") { | ||||
|     SECTION("serializeJsonPretty()") { | ||||
|       array.add(4); | ||||
|       array.add(2); | ||||
|       std::string json; | ||||
|       array.prettyPrintTo(json); | ||||
|       serializeJsonPretty(array, json); | ||||
|       REQUIRE(std::string("[\r\n  4,\r\n  2\r\n]") == json); | ||||
|     } | ||||
|   } | ||||
| @@ -69,7 +69,7 @@ TEST_CASE("std::string") { | ||||
|   SECTION("JsonObject") { | ||||
|     DynamicJsonObject object; | ||||
|  | ||||
|     SECTION("deserializeJson") { | ||||
|     SECTION("deserializeJson()") { | ||||
|       std::string json("{\"hello\":\"world\"}"); | ||||
|  | ||||
|       bool success = deserializeJson(object, json); | ||||
| @@ -156,7 +156,7 @@ TEST_CASE("std::string") { | ||||
|       char json[64]; | ||||
|       object.createNestedObject(key); | ||||
|       eraseString(key); | ||||
|       object.printTo(json, sizeof(json)); | ||||
|       serializeJson(object, json, sizeof(json)); | ||||
|       REQUIRE(std::string("{\"key\":{}}") == json); | ||||
|     } | ||||
|  | ||||
| @@ -165,7 +165,7 @@ TEST_CASE("std::string") { | ||||
|       char json[64]; | ||||
|       object.createNestedArray(key); | ||||
|       eraseString(key); | ||||
|       object.printTo(json, sizeof(json)); | ||||
|       serializeJson(object, json, sizeof(json)); | ||||
|       REQUIRE(std::string("{\"key\":[]}") == json); | ||||
|     } | ||||
|  | ||||
| @@ -197,17 +197,17 @@ TEST_CASE("std::string") { | ||||
|       REQUIRE(std::string("world") == object["hello"]); | ||||
|     } | ||||
|  | ||||
|     SECTION("printTo") { | ||||
|     SECTION("serializeJson()") { | ||||
|       object["key"] = "value"; | ||||
|       std::string json; | ||||
|       object.printTo(json); | ||||
|       serializeJson(object, json); | ||||
|       REQUIRE(std::string("{\"key\":\"value\"}") == json); | ||||
|     } | ||||
|  | ||||
|     SECTION("prettyPrintTo") { | ||||
|     SECTION("serializeJsonPretty()") { | ||||
|       object["key"] = "value"; | ||||
|       std::string json; | ||||
|       object.prettyPrintTo(json); | ||||
|       serializeJsonPretty(object, json); | ||||
|       REQUIRE(std::string("{\r\n  \"key\": \"value\"\r\n}") == json); | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user