Compare commits

..

915 Commits

Author SHA1 Message Date
cf5396aaed Set version to 5.13.0 2018-01-19 15:35:19 +01:00
e390587e91 Kept only two namespaces ArduinoJson and ArduinoJson::Internals 2018-01-19 08:32:15 +01:00
bae179ed67 RawJson() accepts any kind of string and obeys to duplication rules 2018-01-18 09:43:37 +01:00
7e4fcb0868 Add repository and license in library.properties (closes #662) 2018-01-15 10:24:51 +01:00
fbfdca1de9 Added campaign information in links 2018-01-15 10:22:04 +01:00
0612eef69b Marked strdup() as deprecated (issue #658) 2018-01-14 14:02:10 +01:00
ae0b7a3ebd Changed the return type of strdup() to const char* (issue #658) 2018-01-14 14:01:08 +01:00
e92612b511 Changed the rules of string duplication (fixes #658) 2018-01-14 13:46:28 +01:00
5c33fd4b94 Set copyright year to 2018 2018-01-05 09:20:01 +01:00
c3f51e2980 Updated links to arduinojson.org 2018-01-05 09:17:24 +01:00
de47c0af9e Updated links to the book 2017-12-27 14:15:49 +01:00
e53e4e3dd9 Fixed typos 2017-12-15 17:52:47 +01:00
36fe6535c4 Reworked the readme 2017-12-15 17:52:13 +01:00
b55e57a7cf Set version to 5.12.0 2017-12-11 17:50:18 +01:00
7626db624e Changed all link to point to HTTPS version 2017-12-11 17:26:50 +01:00
6d8329b255 Added an example that shows how to save and load a configuration file 2017-12-11 17:20:27 +01:00
461e30148c Reworked all examples 2017-12-11 15:19:28 +01:00
57d98e48f7 Added detection of Keil ARM Compiler (issue #629) 2017-12-05 21:24:28 +01:00
cf2babc598 Added detection of MPLAB XC compiler (issue #629) 2017-12-05 21:18:21 +01:00
d10277df31 Added a clear error message when compiled as C (issue #629) 2017-12-03 13:49:51 +01:00
d3a1203782 Added JsonVariant::operator| to return a default value 2017-11-29 09:49:40 +01:00
126f7ab819 Rewrote example JsonHttpClient.ino (fixes #600) 2017-11-13 16:17:44 +01:00
221c2861fc Changed all links to point to arduinojson.org 2017-11-07 20:42:50 +01:00
66667382e1 Added Alexander Wilms to the list of donators 2017-11-01 09:19:40 +01:00
a7e928d126 Set version to 5.11.2 2017-10-17 10:21:52 +02:00
591fe7e92b Fixed incorrect rounding for float values (fixes #588) 2017-10-17 10:19:21 +02:00
d6e61cbcda Added banner with the new logo 2017-10-16 10:21:44 +02:00
5825366fe4 Added Patrick Elliott to the list of donators 2017-10-07 16:33:53 +02:00
6df204cf40 Split CONTRIBUTING and SUPPORT 2017-10-03 13:01:47 +02:00
3f7e1db549 Added guidelines for contributing 2017-10-03 12:26:49 +02:00
a6091136b0 Fix GCC 7 warning 2017-09-27 11:13:45 +02:00
353bbd0e8c Fix GCC 4.8.5 warning 2017-09-27 09:45:48 +02:00
a428e125fa Travis: Added GCC 7 2017-09-27 09:29:08 +02:00
2e262b2689 Travis: Removed GCC 4.5 2017-09-27 09:29:08 +02:00
a2d055e408 Added Günther Jehle to the list of donators 2017-09-26 09:43:32 +02:00
57defe00ee Fixed DynamicJsonBuffer::clear() not resetting allocation size (fixes #561) 2017-08-30 21:51:10 +02:00
ac5a2676e7 Upgraded to Catch 1.9.7 2017-08-27 15:12:20 +02:00
ed98ea4e43 Implemented JsonVariant comparisons with template friends 2017-08-06 16:26:38 +02:00
729bf0afd2 Made JsonBuffer destructor protected 2017-07-18 22:00:06 +02:00
2ea7ea153c Set version to 5.11.1 2017-07-14 11:17:11 +02:00
2772e66064 Fixed warning "this statement may fall through" (issue #539) 2017-07-14 11:14:56 +02:00
d41f7a8165 Fixed too many decimals places in float serialization (issue #543) 2017-07-14 10:51:46 +02:00
abfd3997eb Fixed "constant exceeds range of float [-Woverflow]" (issue #544) 2017-07-09 15:24:58 +02:00
788c9be016 Removed dependency on PGM_P as Particle 0.6.2 doesn't define it (issue #546) 2017-07-07 23:04:42 +02:00
c3d7a79a83 Travis: Removed Arduino DUE on platformio (fatal error: Ethernet.h: No such file or directory) 2017-07-06 20:56:05 +02:00
1782348275 Added Charles Walker to the list of donators 2017-07-06 20:55:05 +02:00
edfe5c6622 Set version to 5.11.0 2017-06-25 15:11:57 +02:00
2b9492317b Added Charles Haynes to the list of donators 2017-06-22 21:56:41 +02:00
5da41edf6a Removed implementation of JsonBufferAllocated::delete. 2017-06-19 10:05:38 +02:00
476e5aaa86 Added DynamicJsonBuffer::clear() 2017-06-17 16:48:40 +02:00
789fa507b5 Added StaticJsonBuffer::clear() 2017-06-17 15:00:46 +02:00
508f936317 Made JsonBuffer non-copyable (PR #524 by @luisrayas3) 2017-06-17 14:17:01 +02:00
e9d88dda8e Set version to 5.10.1 2017-06-12 21:10:02 +02:00
ecceb71a1e AppVeyor: Added Visual Studio 2017 and restored MinGW 2017-06-07 11:15:22 +02:00
bff77abe6a Fixed reading "true" as a float (issue #516) 2017-06-03 16:22:26 +02:00
98413089f6 Added Google to the list of donators 2017-06-01 20:49:50 +02:00
a2446f6c68 Fixed compilation in IAR Embedded Workbench (issue #515) 2017-06-01 20:47:09 +02:00
c955049207 Fixed IntelliSense errors in Visual Micro (issue #483) 2017-05-28 15:33:03 +02:00
574c00c096 Added links to the ArduinoJson assistant (issue #513) 2017-05-27 15:32:12 +02:00
7415f206ea Reduced code size 2017-05-27 15:08:11 +02:00
f76017a015 Set version to 5.10.0 2017-05-20 09:11:03 +02:00
cda05aec04 Removed configurable number of decimal places (issues #288, #427 and #506) 2017-05-20 09:06:53 +02:00
639286f8b6 Travis: Removed retired images 2017-05-04 22:10:43 +02:00
cc66618e70 Fixed error forming reference to reference (issue #495) 2017-05-04 21:58:28 +02:00
9efc0ec40d Travis: Added GCC 6 2017-05-02 21:32:19 +02:00
34674fc282 Fixed error IsBaseOf is not a member of ArduinoJson::TypeTraits (issue #495) 2017-05-02 21:29:45 +02:00
01c3166043 Moved testimonials to https://bblanchon.github.io/ArduinoJson/ 2017-04-29 17:54:26 +02:00
bf2e3d5669 Updated the list of supported hardware (issue #491) 2017-04-28 10:28:38 +02:00
4e9f0b2e2e Set version to 5.9.0 2017-04-24 21:43:03 +02:00
223f14710d Now compatible with Particle 0.6.1 (issue #294 and PR #461 by @foodbag) 2017-04-24 21:40:19 +02:00
f7ae91b85d Removed unused stuffs 2017-04-22 11:35:55 +02:00
445dff499b ctest --output-on-failure 2017-04-22 11:34:12 +02:00
9afa05e2f4 Removed Print class and converted printTo() to a template method (issue #276) 2017-04-22 11:33:40 +02:00
c3e1677b7d Fixed warnings floating constant exceeds range of floatand floating constant truncated to zero (issue #483) 2017-04-20 14:46:52 +02:00
024976cda2 Renamed folder include/ to src/ (issue #461) 2017-04-20 10:26:40 +02:00
df541a2a22 Changed unit testing framework from Google Test to Catch 2017-04-18 18:22:24 +02:00
f2ef338cb8 Renamed JsonArray::removeAt() into remove() 2017-04-12 21:07:30 +02:00
8c6f64c111 Added JsonArray::remove(iterator) and JsonObject::remove(iterator) (issue #479) 2017-04-12 21:00:13 +02:00
5a16b2117b Travis: Disabled Teensy (PlatformioException: Could not load broken JSON) 2017-04-10 18:55:24 +02:00
71edcaf20f Split unit test into several executables 2017-04-10 15:36:59 +02:00
ac89d91db5 Organized test files in subfolders 2017-04-10 14:32:45 +02:00
e664c1ab05 Set version to 5.8.4 2017-03-26 21:33:12 +02:00
adba668109 Updated project URL 2017-03-25 22:05:06 +01:00
ad972725de Added a script to build a single file distribution 2017-03-25 21:56:37 +01:00
185eccf6f5 Added custom implementation of strtol() (issue #465)
`char` is now treated as an integral type (issue #337, #370)
2017-03-25 21:55:13 +01:00
c4567bac18 Added custom implementation of strtod() (issue #453) 2017-03-19 15:23:06 +01:00
13409c433a Added OpenEVSE LLC to the list of donators 2017-02-22 18:15:21 +01:00
20431debe0 Fuzzing: Run serializer too 2017-02-19 21:41:12 +01:00
797ea356ef Fuzzing: Better seed corpus 2017-02-19 21:30:22 +01:00
2321473c34 Added Prokhoryatov Alexey to the list of donators 2017-02-19 21:01:26 +01:00
0d5f65c5f3 Set version to 5.8.3 2017-02-11 15:12:03 +01:00
c30241775a Fixed JsonVariant::operator[const FlashStringHelper*] (issue #441) 2017-02-11 15:09:08 +01:00
31827d03f9 Added operators == and != for two JsonVariants (issue #436) 2017-02-11 15:06:17 +01:00
7bcdf3e722 JsonHttpClient: Close socket even when connection fails (issue #445) 2017-02-11 14:01:14 +01:00
db9a76f7c6 Fixed an access violation in DynamicJsonBuffer when memory allocation fails (issue #433) 2017-01-31 10:06:40 +01:00
3fd87e8e82 Added fuzzing/ to .mbedignore 2017-01-25 15:28:15 +01:00
22a2786610 Added Christoph Schmidt to the list of donators 2017-01-24 21:21:05 +01:00
2b5a6df1e1 Set version to 5.8.2 2017-01-22 18:08:32 +01:00
5fefeae404 Added deprecated attribute on asArray(), asObject() and asString() (issue #420) 2017-01-22 17:24:17 +01:00
d4f725d1fa Fixed error with string of type unsigned char* (issue #428) 2017-01-22 15:42:47 +01:00
a096098c1f Fixed error when the key of a JsonObject is a char[] and reduced code size when using const references (issue #423) 2017-01-22 11:10:45 +01:00
cc8c0472ca Fixed ignored Stream timeout and made sure we don't read more that necessary (issue #422) 2017-01-22 10:31:05 +01:00
fb554071dc Travis: Added -fsanitize to several builds 2017-01-21 19:49:44 +01:00
17a17c8957 Fixed parsing of comments (issue #421) 2017-01-17 21:48:13 +01:00
2e7d498865 Set version to 5.8.1 2017-01-15 21:02:22 +01:00
567157b005 Fixed error "Stream does not name a type" (issue #412) 2017-01-15 21:01:58 +01:00
ec6cbc5135 Fixed error when both ARDUINOJSON_ENABLE_STD_STREAM and ARDUINOJSON_ENABLE_ARDUINO_STREAM are set to 1 2017-01-15 15:18:59 +01:00
8499f0b960 Fixed errors with Variable Length Arrays (issue #416) 2017-01-15 15:11:26 +01:00
11432253a1 Fixed error when assigning a volatile int to a JsonVariant (issue #415) 2017-01-11 10:17:27 +01:00
f17e1c4a80 Added "Breaking Changes" section for v5.8.0 2017-01-10 10:07:57 +01:00
6b2f6a4f87 Added fuzzer 2017-01-08 16:17:01 +01:00
671329a3e9 Updated copyright year from 2016 to 2017 2017-01-06 21:07:34 +01:00
7e7074502f Set version to 5.8.0 2017-01-03 22:39:44 +01:00
aa306d5573 Travis: Removed XCode 6.1, 6.2 and 6.3 2017-01-03 22:35:58 +01:00
55669e306e Added support for Stream (issue #300) 2017-01-03 22:03:50 +01:00
3f96e070ce Reduced memory consumption by not duplicating spaces and comments 2017-01-01 21:30:20 +01:00
8032a4b564 Extracted StringReader and StringWriter from JsonParser
Split `Internals/` folder into `Data/`, `Deserialization/`, `Serialization/`
2017-01-01 21:30:20 +01:00
b923e8f4df Travis: Added Clang AddressSanitizer and UndefinedBehaviorSanitizer 2017-01-01 21:29:38 +01:00
c5388cf8e7 Travis: Compile all examples with PlatformIO 2016-12-28 20:23:27 +01:00
cb908a2373 Travis: Fixed SSL error problem with coveralls 2016-12-28 20:22:07 +01:00
cecbcd1929 Added operator == to compare JsonVariant and strings (issue #402) 2016-12-23 14:45:32 +01:00
90e0cc6091 JsonHttpClient: use HTTP 1.0 instead of 1.1 (issue #397, PR #399 by @Chris685)
Downgrading to HTTP 1.0 to prevent HTTP Chunked Transfer Encoding.
2016-12-14 19:41:10 +01:00
45bbf6db86 Set version to 5.7.3 2016-12-10 16:00:52 +01:00
432476c98a Added an printTo(char[N]) and prettyPrintTo(char[N]) (issue #292) 2016-12-10 15:59:48 +01:00
1f3e227a8b Added ability to set a nested value like this: root["A"]["B"] = "C" (issue #352) 2016-12-10 15:22:57 +01:00
66c28020c5 Renamed *.ipp to *Impl.hpp because they were ignored by Arduino IDE (issue #396) 2016-12-03 22:19:11 +01:00
6cfe2a58eb Added Doanh Luong to the list of donators 2016-11-25 18:41:33 +01:00
fc6ad51e68 Added the workaround for issue #118 in StringExample.ino 2016-11-24 18:11:02 +01:00
d3bc52951a Set version to 5.7.2 2016-11-23 21:54:56 +01:00
2f7232859e Fixed PROGMEM causing an exception on ESP8266 (issue #383) 2016-11-23 21:53:29 +01:00
4a7232ac99 Added DynamicJsonBuffer to the keywords 2016-11-23 21:25:49 +01:00
72d78432c9 Made PROGMEM available on more platforms (issue #381) 2016-11-16 22:24:58 +01:00
f6cd42d916 Travis: Added Arduino 1.6.12, removed 1.5.8 2016-11-16 22:24:41 +01:00
542dff2a08 Added Andrew Melvin to the list of donators 2016-11-15 21:48:40 +01:00
e75e843c88 Moved JsonBuffer size calculator to https://bblanchon.github.io/ArduinoJson/ 2016-11-13 20:48:03 +01:00
146a76247c Set version to 5.7.1 2016-11-13 20:21:16 +01:00
f28157cab7 Fixed compilation error when index is not an int (issue #381) 2016-11-13 20:19:36 +01:00
1ce16ce449 Added support for PROGMEM (issue #76) 2016-11-13 20:16:12 +01:00
c310e7e8b7 Set version to 5.7.0 2016-11-06 17:52:57 +01:00
aa2ef79e55 Templatized all functions using String or std::string
* Removed `ArduinoJson::String`
* Removed `JsonVariant::defaultValue<T>()`
* Removed non-template `JsonObject::get()` and `JsonArray.get()`
* Fixed support for `StringSumHelper` (issue #184)
* Replaced `ARDUINOJSON_USE_ARDUINO_STRING` by `ARDUINOJSON_ENABLE_STD_STRING` and `ARDUINOJSON_ENABLE_ARDUINO_STRING` (issue #378)
* Added example `StringExample.ino` to show where `String` can be used
2016-11-06 17:52:18 +01:00
7ad57f1c33 Added Yoeri Kroon to the list of donators 2016-10-27 15:19:13 +02:00
cbfd331e50 JsonBuffer calculator now generates more compact expression 2016-09-30 10:44:05 +02:00
e6f55b1f6f Increased default nesting limit to 50 when compiled for a computer (issue #349) 2016-09-21 22:11:38 +02:00
bb805e93cb Set version to 5.6.7 2016-09-20 10:11:19 +02:00
deb57b960b Fixed parser that incorrectly rejected floats containing a + (issue #349) 2016-09-19 10:08:14 +02:00
8a9b918bf4 Fixed undefined behavior in Prettyfier and Print (issue #354) 2016-09-17 13:51:54 +02:00
2f6f3d0629 Fixed return value of JsonObject::set() (issue #350) 2016-09-16 10:10:31 +02:00
a60b35f41c Extracted class JsonSerializer 2016-09-11 13:43:21 +02:00
6757f35a3a Set version to 5.6.6 2016-08-29 20:55:36 +02:00
ffb9b6d1ba Fixed JsonVariant::success() which didn't propagate JsonArray::success() nor JsonObject::success() (issue #342). 2016-08-29 20:54:39 +02:00
e401498e4a Fixed JsonBuffer size calculator 2016-08-26 10:10:19 +02:00
d30e940b3b Added JsonBuffer size calculator 2016-08-25 19:08:12 +02:00
05ea5e04c8 Added Darlington Adibe to the list of donators 2016-08-25 11:40:31 +02:00
a7ef99d0fe Added .mbedignore for ARM mbdeb (PR #334 by @nuket) 2016-08-25 11:40:04 +02:00
f2a8b52c2c PlatformIO: Use the same name as for Arduino IDE (PR #339) 2016-08-24 13:44:10 +02:00
409ca7ee4e Fixed -Wparentheses warning introduced in v5.6.5 (PR #335 by @nuket) 2016-08-17 20:37:44 +02:00
387b565705 Set version to 5.6.5 2016-08-15 12:25:48 +02:00
96f486001d as<char*>() now returns true when input is null (issue #330) 2016-08-15 12:24:08 +02:00
a498abc14a Set version to 5.6.4 2016-07-20 13:16:14 +02:00
c64340a9bb Fixed error in float serialization (issue #324) 2016-07-20 13:15:17 +02:00
79d80a5dbf Set version to 5.6.3 2016-07-19 08:59:42 +02:00
7ebff5949f Fixed call of overloaded isinf(double&) is ambiguous (issue #284) 2016-07-19 08:57:19 +02:00
434080572c AppVeyor: Disabled build on MinGW32 2016-07-17 18:29:38 +02:00
c87a0e97ab Added as<JsonArray>() as a synonym for as<JsonArray&>()... (issue #291) 2016-07-17 17:22:58 +02:00
2dbd94951c Improved speed of float serialization (about twice faster) 2016-07-10 16:12:49 +02:00
1e044f50c7 Set version to 5.6.2 2016-06-30 20:23:58 +02:00
a7aa98510c Restored Travis build on all clang version 2016-06-30 20:23:21 +02:00
729ab56878 Fixed build when another lib does #undef isnan (issue #284) 2016-06-30 20:22:47 +02:00
907b627e16 Set version to 5.6.1 2016-06-24 09:24:44 +02:00
10fcca20f8 Added missing #pragma once (issue #310) 2016-06-23 21:27:24 +02:00
59cd1f1433 Fix packaging script 2016-06-22 21:51:37 +02:00
4a2c570270 Set version to 5.6.0 2016-06-22 21:42:55 +02:00
8c7edbd9c3 ArduinoJson is now a header-only library (issue #199) 2016-06-22 21:41:19 +02:00
0801e16327 Added GitHub issue template 2016-06-15 10:13:43 +02:00
0df2a365f5 Set version to 5.5.1 2016-06-06 22:12:48 +02:00
c7d6d33e6c Fixed compilation error with Intel Galileo (issue #299) 2016-06-06 22:10:28 +02:00
c705f3cfeb Disabled build on Clang 3.5, 3.6, 3.7 and 3.8 because llvm.org/apt is down 2016-06-06 22:09:34 +02:00
7fecb36aee Added Kestutis Liaugminas to the list of donators 2016-06-03 20:16:47 +02:00
657a2ea8d9 Added Jon Williams to the list of donators 2016-05-23 11:02:19 +02:00
dd064f4c96 Added Arduino 1.6.9 to the continuous integration 2016-05-22 22:24:31 +02:00
3bc05b97ea Set version to 5.5.0 2016-05-22 15:00:09 +02:00
bbd515f6f6 Added Nick Koumaris to the list of donators 2016-05-22 14:58:48 +02:00
9b3e3a3d9c Renamed JsonVariant::invalid<T>() to JsonVariant::defaultValue<T>() 2016-05-18 09:17:45 +02:00
a3a2ca4796 Added JsonVariant::success() (issue #279) 2016-05-18 09:15:49 +02:00
eab13dc565 Added Martijn van den Burg to the list of donators 2016-05-16 20:35:26 +02:00
bebd1c400c Added OSX build on Travis 2016-05-15 09:41:53 +02:00
36d1bb2f52 Added Charles-Henri Hallard to the list of donator 2016-05-08 20:59:59 +02:00
ae32695c3e Set version to 5.4.0 2016-05-06 08:46:13 +02:00
c5d19a4dbd Changed ::String to ArduinoJson::String (issue #275) 2016-05-06 08:44:31 +02:00
78728c6547 Set version to 5.3.0 2016-04-30 09:49:45 +02:00
a8032f81d9 Added JsonVariant JsonBuffer::parse() (issue #265) 2016-04-30 09:47:53 +02:00
a138791964 Added custom implementation of ftoa (issues #266, #267, #269 and #270) 2016-04-28 18:54:14 +02:00
f9f002c8f7 Fix unsigned long printed as signed long (issue #170) 2016-04-28 08:42:59 +02:00
f192d5c12e Set version to 5.2.0 2016-04-16 16:17:19 +02:00
a6724bd03f Added RawJson() to insert pregenerated JSON portions (issue #259) 2016-04-16 16:15:01 +02:00
c77c3f33ef Added JsonArray::copyTo() and JsonArray::copyFrom() (issue #254) 2016-04-14 20:06:38 +02:00
623aeee9bf Added example JsonHttpClient (issue #256) 2016-04-08 20:11:36 +02:00
a241d53d28 Added JsonVariant::as<char*>() as a synonym for JsonVariant::as<const char*>() (issue #257) 2016-04-05 20:47:04 +02:00
11500d2ff5 Fixed strange Markdown rendering in README 2016-04-05 10:27:50 +02:00
85708bc94f Added Arduino 1.6.8 to the continuous integration 2016-04-05 09:49:12 +02:00
ba6e8856f2 Added Tweet from @hemalchevli 2016-04-04 22:23:51 +02:00
c8448b0abf Added Gustavo Donizeti Gini to the list of donators 2016-02-29 09:27:52 +01:00
e35248ffc4 Set version to 5.1.1 2016-02-23 21:30:01 +01:00
b47a3b566a Removed duplication when one replaces a value in a (PR #232 by @ulion) 2016-02-23 21:27:52 +01:00
6ab23bd523 Added RedBearLab BLE Nano to the list of supported platforms 2016-02-17 10:24:37 +01:00
987afff0e9 Travis: added GCC 4.4, 4.5, 4.7, 4.8, 4.9, 5.2 and Clang 3.5, 3.6, 3.7 2016-02-17 10:15:40 +01:00
564c62f3b3 Set version to 5.1.0 2016-02-14 16:20:33 +01:00
8733f95e51 Added support of long long (issue #171)
Moved all build settings to `ArduinoJson/Configuration.hpp`
Added AppVeyor settings in source tree
2016-02-14 16:18:13 +01:00
ce63e9c3c3 Added comments in examples 2016-02-01 13:31:07 +01:00
77b7124cf1 Set version to 5.0.8 2016-01-31 21:57:08 +01:00
6a608d4b49 Fixed JsonVariant::is<bool>() that was incorrectly returning false (issue #214) 2016-01-31 21:56:04 +01:00
01924618bd Merge pull request #215 from ivankravets/patch-1
Use tagged source code from repo
2016-01-31 21:00:46 +01:00
666e2fd0ce Use tagged source code from repo
http://docs.platformio.org/en/latest/librarymanager/config.html#version
2016-01-31 21:24:37 +02:00
0cfc25d751 Added Johann Stieger to the list of donators 2016-01-07 22:40:12 +01:00
b6d8e6c989 Updated copyright year from 2015 to 2016 2016-01-07 22:39:57 +01:00
ab2502f7b8 Fix misspelled PlatformIO 2015-12-23 14:42:22 +01:00
c57e6f3bd8 Made the library compatible with platform.io (issue #181) 2015-12-22 23:43:44 +01:00
b54f1ffc1d Travis: build with Arduino 1.5.8 and 1.6.7 2015-12-22 22:01:30 +01:00
bd0ea42277 Added a badge with the number of stars 2015-11-25 21:22:49 +01:00
7ae43bc4f8 Set version to 5.0.7 2015-11-25 21:15:11 +01:00
056682327b Changed String to be a typedef of std::string (issues #142 and #161) 2015-11-25 21:09:18 +01:00
8b66a25f66 Removed a useless line of code 2015-11-22 10:18:21 +01:00
96245dd3b4 Made library easier to use from a CMake project: simply add_subdirectory(ArduinoJson/src) 2015-11-19 21:53:27 +01:00
9cc49da68a Moved to the new Travis infrastructure 2015-11-19 21:31:23 +01:00
224918b463 Set version to 5.0.6 2015-11-09 23:10:14 +01:00
cbeefa2503 Examples: Added a loop to wait for serial port to be ready (issue #156) 2015-11-09 22:56:49 +01:00
6d68806633 Added donators list 2015-11-09 22:55:29 +01:00
ba3617c22f Added parameter to DynamicJsonBuffer constructor to set initial size (issue #152) 2015-11-09 21:37:40 +01:00
b7d9bb2765 Merge pull request #150 from marvinroger/patch-1
Add library category
2015-11-06 14:50:18 +01:00
74b42e2251 Add library category 2015-11-06 14:30:20 +01:00
c0cf9c3fcc Use float instead of double to reduce the size of JsonVariant (issue #134) 2015-10-30 23:03:16 +01:00
9f3ce18f06 Add overload JsonObjectSuscript::set(value, decimals) (issue #143) 2015-10-30 22:29:47 +01:00
b9e3255c9e Reached 100.00% code coverage :-) 2015-09-29 22:20:36 +02:00
e657396f65 Added -fno-rtti 2015-09-29 21:51:21 +02:00
929f608f2f Added list of supported platforms 2015-09-29 21:49:19 +02:00
c6a4bfa886 Fixed ambiguous overload with JsonArraySubscript and JsonObjectSubscript (issue #122) 2015-09-28 22:14:50 +02:00
d5e25b12b8 Added a comment to prevent issue #112 2015-09-27 14:18:14 +02:00
7cf6fe6d62 Fixed return type of JsonArray::is<T>() and some others (issue #121) 2015-09-19 16:25:18 +02:00
155dd653e7 Fixed printTo(String) which wrote numbers instead of strings (issue #120) 2015-09-19 16:23:09 +02:00
b5c8cd1766 Set version to 5.0.3 2015-09-19 16:20:06 +02:00
4967e389c5 Added a script to create the package with the old layout (issues #97, #114, #116) 2015-09-13 21:04:30 +02:00
ffbaebd198 Added testimonials from Reddit users erm_what_ and makerhacks 2015-09-06 22:11:53 +02:00
04b8781c8d Fixed GCC warning "declaration shadows a member" (issue #103) 2015-09-01 22:26:51 +02:00
5a4d993f7d Fixed memory alignment, which made ESP8266 crash (issue #104) 2015-09-01 22:21:50 +02:00
823a172681 Fixed segmentation fault in StaticJsonBuffer (issue #104) 2015-08-29 22:51:17 +02:00
a1943e21ed Fixed compilation on Visual Studio 2010 and 2012 (issue #107) 2015-08-27 21:47:49 +02:00
01c287bc89 Removed -Wdeprecated-register for GCC 2015-08-26 21:00:28 +02:00
0cf8249b14 Fixed Clang warning "register specifier is deprecated" (issue #102) 2015-08-26 20:49:24 +02:00
a8265a799d Merge pull request #100 from Eriatolc/master
Fix typo in Readme & clean file
2015-08-24 18:18:05 +02:00
18bb653f10 fix typo 2015-08-24 18:10:10 +02:00
a003a31952 Fixed compilation with Arduino 1.0.6 (issue #99) 2015-08-24 15:20:40 +02:00
0a1c27f873 Updated copyright year 2015-08-20 15:24:35 +02:00
75f8e25aed Added a script to measure the size of the sample programs 2015-08-19 22:12:20 +02:00
39c506b419 Reduced generator size. Fixed Visual Studio warnings 2015-08-19 16:08:19 +02:00
ef2641b49b Store parsed token as string and allow conversion between various types (issues #64, #69, #90, #93) 2015-08-10 17:22:22 +02:00
bce101578d Merge branch 'master' into 5.0 2015-08-02 14:28:20 +02:00
10e466426a Removed the wrong #include 2015-08-02 09:20:21 +02:00
9b90aeffa5 Added call to arduino compiler in travis 2015-08-02 09:20:08 +02:00
601b51890f Fixed segmentation fault in when memory allocation fails (issue #92) 2015-08-01 16:57:29 +02:00
2524a00a96 Fixed segmentation fault in DynamicJsonBuffer when memory allocation fails (issue #92) 2015-08-01 16:31:59 +02:00
e31d667bec Added support of comments in JSON input (issue #88) 2015-07-27 22:18:54 +02:00
c161f698fc Implicitly duplicate String in the JsonBuffer (issue #84, #87) 2015-07-25 15:38:12 +02:00
92e687303d Added support of non standard JSON input (issue #44) 2015-07-10 22:11:26 +02:00
f5b83f9314 Added greeting to Giancarlo Canales Barreto 2015-06-14 15:26:33 +02:00
5e7b9ec688 Fix buffer overflow (pull request #81) 2015-06-10 21:33:20 +02:00
78ae0b8aee Updated changelog 2015-05-31 14:42:09 +02:00
283dffc035 Switched to the new library layout 2015-05-31 14:31:41 +02:00
0aded2a798 Reduced code size 2015-05-31 14:25:01 +02:00
1b5be892b9 Added support of String class (issue #55, #56, #70, #77) 2015-05-25 15:38:58 +02:00
756c279cdc Redesigned JsonVariant to leverage converting constructors instead of assignment operators 2015-05-23 15:32:50 +02:00
08d05df00e Added JsonPrintable::measureLength() (issue #75) 2015-05-09 16:53:48 +02:00
c385862be1 Updated change log for v4.3 2015-05-03 15:49:44 +02:00
0eff567910 Added JsonArray::removeAt() (issue #58) 2015-05-02 15:16:18 +02:00
94d38c0680 Added issue #68 in changelog 2015-04-27 16:01:05 +02:00
81285f49fe Fixed issue #68 2015-04-27 15:57:40 +02:00
877096d49d Fixed issue #67 2015-04-23 21:27:58 +02:00
bfe60243a4 Fixed issue #65 2015-04-18 15:37:15 +02:00
ca9d606e72 Added example JsonUdpBeacon 2015-02-25 22:27:30 +01:00
24d21467dd Updated change log for v4.2 2015-02-07 20:49:05 +01:00
41651136bf Switched back to old library layout (issues #39, #43 and #45) 2015-02-07 20:46:46 +01:00
5e5f060fc0 Updated copyright for 2015 2015-02-07 16:05:48 +01:00
29ab5fc9c2 Reduced code size by 12 bytes 2015-02-07 16:01:09 +01:00
80913b8044 Fixed Visual Studio's warnings 2015-02-07 15:05:46 +01:00
02960f28e4 Fix coveralls command line 2015-02-03 14:38:44 +01:00
8db338ba14 Removed global new operator overload (issue #40, #45 and #46) 2015-02-01 20:59:31 +01:00
dadd8986dc Mute compiler warning (issue #47) 2015-01-15 21:05:14 +01:00
e2016cf65b Added an example with EthernetServer 2015-01-10 15:25:27 +01:00
1b214a60fa Fixed a typo 2014-12-21 15:25:42 +01:00
8560583ee7 Fixed GCC warning 2014-12-21 10:52:30 +01:00
2932c4ee43 Removed std::nothrow because it's not supported in Arduino 2014-12-21 10:46:32 +01:00
e8c127a894 Fixed memory leak in test fixture 2014-12-20 19:19:48 +01:00
d7ac7ff9a3 Added DynamicJsonBuffer 2014-12-20 15:45:09 +01:00
aef7e43c48 Use DynamicJsonBuffer instead of arbitrary sized StaticJsonBuffer 2014-12-20 15:42:43 +01:00
d855b0f98c Test object allocation with DynamicJsonBuffer 2014-12-20 15:16:06 +01:00
c726506b47 Added std::nothrow 2014-12-20 15:15:41 +01:00
c32e306be9 Test DynamicJsonBuffer behavior with arrays 2014-12-14 17:57:44 +01:00
13e907c894 Test that DynamicJsonBuffer.size() is the sum of all blocks 2014-12-13 21:02:42 +01:00
d19a34152f Test that DynamicJsonBuffer.blockCount() increases as expected 2014-12-13 20:52:59 +01:00
19cce08b2b Test initial value of DynamicJsonBuffer.blockCount() 2014-12-13 20:22:52 +01:00
3cd6f66067 Test that DynamicJsonBuffer can't alloc more than BLOCK_CAPACITY 2014-12-13 10:13:24 +01:00
ada588c112 Test that DynamicJsonBuffer returns a different pointer after each alloc() 2014-12-13 10:03:01 +01:00
0d57fe5a7e Test that DynamicJsonBuffer grows after each alloc 2014-12-13 09:54:04 +01:00
5a74beb7e2 Test initial size() of DynamicJsonBuffer 2014-12-11 21:05:45 +01:00
e2d591b9ff Fixed build in travis 2014-12-09 22:53:05 +01:00
8082185ac4 Fixed template instantiation warning (issue #35) 2014-12-09 20:46:45 +01:00
85ebc8a1ec Fixed shadowing warning (issue #36) 2014-12-09 20:23:49 +01:00
9ca32e664e Added unit tests for issue #34 2014-12-08 20:22:01 +01:00
566b76121a Fix test of ListConstIterator 2014-12-05 22:28:37 +01:00
562080f22d Added conversion from ListIterator to ListConstIterator 2014-12-05 22:28:16 +01:00
bb8bddc758 Test const itertor 2014-12-05 22:11:45 +01:00
9eb8842dda Test operator*() 2014-12-05 21:54:49 +01:00
97558abc29 Test with a missing closing quote 2014-12-05 21:46:51 +01:00
160ce092ff Added code coverage badge 2014-11-30 15:11:19 +01:00
d6974127b4 Moved documentation to the wiki 2014-11-29 17:00:38 +01:00
092660db52 Moved documentation to the wiki 2014-11-29 16:59:22 +01:00
348357eb04 Merge branch '4.0'
Conflicts:
	JsonGenerator.cpp
	JsonGenerator.h
	JsonGenerator/EscapedString.cpp
	JsonGenerator/EscapedString.h
	JsonGenerator/IndentedPrint.cpp
	JsonGenerator/IndentedPrint.h
	JsonGenerator/JsonArray.h
	JsonGenerator/JsonArrayBase.cpp
	JsonGenerator/JsonArrayBase.h
	JsonGenerator/JsonObject.h
	JsonGenerator/JsonObjectBase.cpp
	JsonGenerator/JsonObjectBase.h
	JsonGenerator/JsonPrettyPrint.cpp
	JsonGenerator/JsonPrettyPrint.h
	JsonGenerator/JsonPrintable.cpp
	JsonGenerator/JsonPrintable.h
	JsonGenerator/JsonValue.cpp
	JsonGenerator/JsonValue.h
	JsonGenerator/Print.cpp
	JsonGenerator/Print.h
	JsonGenerator/Printable.h
	JsonGenerator/StringBuilder.cpp
	JsonGenerator/StringBuilder.h
	JsonGeneratorTests/EscapedStringTests.cpp
	JsonGeneratorTests/Issue10.cpp
	JsonGeneratorTests/JsonArrayTests.cpp
	JsonGeneratorTests/JsonObject_Indexer_Tests.cpp
	JsonGeneratorTests/JsonObject_PrintTo_Tests.cpp
	JsonGeneratorTests/JsonValue_Cast_Tests.cpp
	JsonGeneratorTests/JsonValue_PrintTo_Tests.cpp
	JsonGeneratorTests/PrettyPrint_Array_Tests.cpp
	JsonGeneratorTests/PrettyPrint_Object_Tests.cpp
	JsonGeneratorTests/PrettyPrint_String_Tests.cpp
	JsonGeneratorTests/StringBuilderTests.cpp
	JsonParser.cpp
	JsonParser.h
	JsonParser/JsonArray.cpp
	JsonParser/JsonArray.h
	JsonParser/JsonArrayIterator.h
	JsonParser/JsonObject.cpp
	JsonParser/JsonObject.h
	JsonParser/JsonObjectIterator.h
	JsonParser/JsonPair.h
	JsonParser/JsonParser.h
	JsonParser/JsonParserBase.cpp
	JsonParser/JsonParserBase.h
	JsonParser/JsonToken.cpp
	JsonParser/JsonToken.h
	JsonParser/JsonValue.cpp
	JsonParser/JsonValue.h
	JsonParser/README.md
	JsonParserTests/GbathreeBug.cpp
	JsonParserTests/JsonArrayIteratorTests.cpp
	JsonParserTests/JsonArrayTests.cpp
	JsonParserTests/JsonObjectIteratorTests.cpp
	JsonParserTests/JsonObjectTests.cpp
	JsonParserTests/JsonStringTests.cpp
	JsonParserTests/TestHashGenerator.cpp
	README.md
	library.json
2014-11-29 14:30:23 +01:00
69f6967ad4 Merge branch '4.0' of github.com:bblanchon/ArduinoJson into 4.0 2014-11-29 14:09:29 +01:00
4e3f554b68 Made script executable on unix 2014-11-29 14:03:32 +01:00
79f6f0dd86 Minor changes in doc 2014-11-29 13:53:18 +01:00
02f6fab025 Minor changes in the docs 2014-11-29 10:36:15 +01:00
a61fc5b836 Minor corrections to the doc 2014-11-29 09:30:11 +01:00
f3a84857d9 Removed unused function 2014-11-22 18:54:40 +01:00
95eb16233c Added tests of JsonArray::invalid() and JsonObject::invalid() 2014-11-22 18:52:46 +01:00
33654a480b Added Build Status badge 2014-11-15 15:22:37 +01:00
c296f27640 Disabled threading in googletest 2014-11-15 15:09:48 +01:00
4f55f63a77 Improved Travis configuration 2014-11-15 15:02:48 +01:00
a66299a936 Replaced -Wpedantic by -pedantic 2014-11-15 14:58:29 +01:00
a2cbb68a40 Added missing argument to cmake 2014-11-15 14:46:00 +01:00
4163debdd9 Added Travis configuration file 2014-11-15 14:42:23 +01:00
c92ff81ddd Updated for v4.0 2014-11-11 18:34:13 +01:00
783add8357 Added Arduino 1.0.6 requirement 2014-11-11 18:34:04 +01:00
3b77dbbed7 Fixed warnings in Visual Studio 2014-11-11 18:18:26 +01:00
160ff0961e Added PlatformIO manifest file 2014-11-11 18:09:58 +01:00
06909c451f Added donation link 2014-11-11 17:50:40 +01:00
b7d8b45e5a Synchronized with master 2014-11-11 17:35:20 +01:00
88bfaac7e6 Changed expected output from "0.0" to "0.00" 2014-11-11 17:33:54 +01:00
3c51017e4a Added tests fo JsonVariant::printTo() 2014-11-11 17:26:51 +01:00
33f6376122 Fixed is<T>() 2014-11-11 17:26:13 +01:00
2beb87136b Fixed writeTo() of invalid and undefined value 2014-11-11 17:15:53 +01:00
f6f8a63b99 Added a header to simplify library usage 2014-11-11 16:56:02 +01:00
e0ce711eb4 Fixed cpplint warnings 2014-11-11 16:43:35 +01:00
0911d8d796 Fixed cpplint warnings 2014-11-11 16:41:45 +01:00
99e5ff78f3 Removed empty document 2014-11-11 15:17:20 +01:00
5236de1433 Added memory usage 2014-11-11 14:46:23 +01:00
0c9451fd5f Updated for v4.0 2014-11-11 14:26:57 +01:00
dfac1cf71a Updated for v4.0 2014-11-11 14:11:49 +01:00
1e20e6ef77 Renamed file 2014-11-11 14:11:40 +01:00
a7b366e74f Updated for v4.0 2014-11-11 14:05:54 +01:00
3cfd36a5ce Reduced size by 16 bytes by inlining indent() and unindent() 2014-11-09 16:10:30 +01:00
3919f07890 Reduced size by 22 bytes by removing writeEmptyArray() and writeEmptyObject() 2014-11-09 13:54:03 +01:00
12e374d0da Reduced size by 2 bytes 2014-11-08 21:37:02 +01:00
36ee4876c6 Reduced sze by 26 bytes by inlining getOrCreateNodeAt() 2014-11-08 21:32:30 +01:00
05db56760f Reduced size by 38 bytes by inlining addNode() 2014-11-08 21:22:03 +01:00
e94089ca56 Reduced size by 52 bytes by inlining createNode() 2014-11-08 21:16:47 +01:00
dc1d0ca698 Added #include <ListNode.hpp> 2014-11-08 21:16:14 +01:00
627d85ce23 Added #pragma once 2014-11-08 21:15:34 +01:00
f6133f2d36 Reduced size by 300 bytes by reusing the JsonPrettyPrint from v3 2014-11-08 19:40:07 +01:00
d8dbfe6e6d Reduced size by 706 bytes by removing virtual destructors. 2014-11-08 17:13:41 +01:00
1c450fd3aa Fixed floating point value parsing in the form "4e2" or "4E2". 2014-11-08 15:56:40 +01:00
2e47d546b2 Writing documentation... 2014-11-08 15:48:51 +01:00
01f13c1b11 Writing documentation... 2014-11-07 22:12:40 +01:00
9dc7c2a031 Writing documentation... 2014-11-07 21:41:42 +01:00
fe779dace4 Writing documentation... 2014-11-07 20:14:09 +01:00
6eef52cc9c Writing documentation... 2014-11-07 18:21:34 +01:00
d38131d495 Added JsonObject::containsKey() 2014-11-07 17:27:30 +01:00
b4b475d692 Simplified generator example 2014-11-07 16:23:21 +01:00
fe17706b6c Writing documentation... 2014-11-07 16:18:19 +01:00
d7bad3d70b Added flag -fno-exceptions 2014-11-07 13:31:55 +01:00
5a56ec0636 Renamed writeInteger to writeLong to be more consistent 2014-11-07 13:27:42 +01:00
35a95f00d9 Inlined the content of JsonWriter.cpp 2014-11-07 13:23:11 +01:00
93397880ca Fixed compilation error with old GCC version (like the one in Arduino 1.0.6) 2014-11-07 12:12:58 +01:00
8c4c3d8fda Fixed warning with GCC 2014-11-07 11:59:07 +01:00
49025d322f Fixed warning in GCC 2014-11-07 11:52:18 +01:00
9d2ee6ce63 Fixed creation of JsonVariant::_invalid 2014-11-07 11:45:28 +01:00
70aabca0f7 Remove diagnostic lines 2014-11-07 11:28:04 +01:00
dfd59f644b Added comments 2014-11-07 09:35:53 +01:00
ee520d1ff5 Cleaned parseArray() 2014-11-07 09:30:00 +01:00
ee580f1968 Removed comment line 2014-11-07 09:21:07 +01:00
5179aa0d4f Cleaned parseObject() 2014-11-07 09:20:48 +01:00
a7b78fadb0 Removed StaticJsonBuffer.clear() 2014-11-06 17:08:42 +01:00
d94bcbf249 Added comments 2014-11-06 16:58:24 +01:00
086e99efb4 Added comment 2014-11-06 16:29:29 +01:00
7b8aba46cc Fixed compilartion error 2014-11-06 16:08:15 +01:00
579c9359df Added comments 2014-11-06 16:08:06 +01:00
885e35e892 Added comments 2014-11-06 14:48:14 +01:00
e7864c9566 Use Print& instead of Print* 2014-11-06 14:29:29 +01:00
6e67bc442f Added comments 2014-11-06 14:27:14 +01:00
ac9b776aa1 Fixed remaining cpplint warnings 2014-11-06 14:08:53 +01:00
d8e595907b Muted runtime/references 2014-11-06 13:59:38 +01:00
1e02fabdec Simplified JsonWriter and PrettyJsonWriter 2014-11-06 13:52:33 +01:00
79bfe731af Added comments 2014-11-06 13:42:16 +01:00
a3425a6306 Added a nesting limit to the parser to prevent stack overflow that could be a security issue 2014-11-06 10:24:37 +01:00
2e4dd2d591 Updated warning flags 2014-11-06 09:44:09 +01:00
f360cc664c Added empty line at end of file 2014-11-06 09:28:28 +01:00
ce6f839153 Warnings level were not correct with Clang 2014-11-06 09:28:04 +01:00
01949f7da0 Added more tests of StaticJsonBuffer 2014-11-05 21:10:36 +01:00
08de76e2ba Simplified StaticJsonBuffer tests 2014-11-05 13:54:53 +01:00
cb97e1fa19 Added tests of StaticJsonBuffer 2014-11-05 13:45:30 +01:00
95e564bfb6 Added test of a failing JsonBuffer::createObject() 2014-11-05 13:31:31 +01:00
342b079133 Rename Node into ListNode 2014-11-05 13:14:15 +01:00
8138c64116 Renamed NodeIterator into ListIterator 2014-11-05 13:12:20 +01:00
64b4e15ce6 Added tests of JsonObject::const_iterator 2014-11-05 13:10:22 +01:00
e722fc50b1 Delete Printable interface because it's not used anymore 2014-11-05 12:51:22 +01:00
a9f4f611d4 Extracting a common base class for JsonArray and JsonObject... 2014-11-05 11:53:08 +01:00
0fb4fa8f86 Extracting a common base class for JsonArray and JsonObject... 2014-11-05 11:43:59 +01:00
7d73e63c78 Extracting a common base class for JsonArray and JsonObject... 2014-11-05 11:38:36 +01:00
ebb591ef28 Extracting a common base class for JsonArray and JsonObject... 2014-11-05 11:28:19 +01:00
31dea656d5 Splitted JsonIterator into NodeIterator and NodeConstIterator 2014-11-05 11:16:36 +01:00
768312e870 Merged JsonArrayNode and JsonObjectNode into a single template 2014-11-05 11:09:48 +01:00
5d0e326bfd Removed JsonPair constructor 2014-11-05 09:31:29 +01:00
8ac4346fd5 Replaced JsonObjectIterator and JsonObjectConstIterator by a template 2014-11-05 09:27:03 +01:00
bafec6f1a3 Unified JsonArrayNode and JsonObjectNode 2014-11-05 09:24:15 +01:00
c6d11294e4 Replaced JsonArrayIterator and JsonArrayConstIterator by a template 2014-11-05 09:04:26 +01:00
6ce2497879 Move JsonPrintable into Internals/ 2014-11-05 08:53:41 +01:00
782b178f4e Fixed warnings in Visual Studio 2014-11-04 19:53:13 +01:00
64529bb1a3 Added test of JsonVariant::invalid() 2014-11-04 13:10:25 +01:00
01dc0d6268 Added test of undefined JsonVariant 2014-11-04 13:07:14 +01:00
289b5333d6 Improved test printers 2014-11-04 13:06:47 +01:00
4a17e8c34b Minor changes 2014-11-04 10:38:33 +01:00
c4cda780d5 Added more tests of subscript operator 2014-11-04 10:33:09 +01:00
e5669577df Added JsonVariant::operator[](const char*) 2014-11-04 10:30:45 +01:00
97768ec176 Added JsonVariant::operator[](int) 2014-11-04 10:22:13 +01:00
e25eaed75a Cleaned #includes 2014-11-04 10:01:21 +01:00
09f6d059a7 Renamed JsonValue to JsonVariant 2014-11-04 09:51:25 +01:00
699292b058 Arduino example are now compiling 2014-11-03 21:29:55 +01:00
d9cc259df3 Added declaration for placement new because it was not available in Arduino 2014-11-03 21:29:19 +01:00
43ad37e7ce Now use relative paths in for #include 2014-11-03 18:35:22 +01:00
bb816037d6 Minor change 2014-11-03 18:29:52 +01:00
04cde11a04 Now use uint8_t to store decimal count 2014-11-03 18:28:24 +01:00
2f8fde6772 Added ReferenceType::operator!=() 2014-11-03 18:25:17 +01:00
f224408c07 Added tests of comparison operators 2014-11-03 18:23:39 +01:00
21e073a3b4 Renamed JsonValueTests into JsonValue_Copy_Tests 2014-11-03 17:52:30 +01:00
f9ea82a2af Added many tests storing values in JsonValue 2014-11-03 17:50:01 +01:00
1ce6d663af Replaced 0 literals by more explicit '\0' and NULL 2014-11-03 17:03:55 +01:00
c1c63067d4 Removed old source files 2014-11-03 16:45:06 +01:00
a8d3e9997e Ported test of Gbathree's bug 2014-11-03 14:38:46 +01:00
7cdf7b1769 Added equality operator 2014-11-03 14:37:50 +01:00
429d5011b4 Made it possible to use const JsonObject& 2014-11-03 14:33:33 +01:00
54f9bd9572 Simplified JsonWriter hierarchy 2014-11-03 12:58:52 +01:00
2a60c96baf Removed virtuals from JsonWriter hierarchy 2014-11-03 12:51:24 +01:00
f26f4263ea Removing virtual methods... 2014-11-03 12:32:47 +01:00
507f809da0 Merge branch 'merge-parser-and-generator' of github.com:bblanchon/ArduinoJson into merge-parser-and-generator 2014-11-03 11:46:49 +01:00
ad83820257 Added integration test with YQL data 2014-11-01 16:39:51 +01:00
cd773e3f37 Added an integration test that uses prettyPrintTo() 2014-11-01 13:45:07 +01:00
9da7dce310 Fixed double formatting issue 2014-11-01 13:30:37 +01:00
825ab0357e Added integration test with a JSON sample from OpenWeatherMap 2014-11-01 09:09:58 +01:00
fead9b50b1 Fixed bug in parser when "null", "true" or "false" is mispelled 2014-10-31 21:08:04 +01:00
98463ea168 Added a script to run tests continuously 2014-10-31 18:41:34 +01:00
74b4544560 Fixed parsing when opening brace/bracket is missing 2014-10-31 16:50:21 +01:00
2b5b8fb4c5 Removed empty files 2014-10-31 16:30:10 +01:00
d35b680481 Removed ForwardDeclarations.hpp 2014-10-31 12:27:33 +01:00
ca0fbf00f9 Cleaning up... 2014-10-31 12:16:32 +01:00
5443e90baf Cleaning up... 2014-10-31 12:02:15 +01:00
a5dbb397ca Fixed failing test with clang 2014-10-31 11:38:58 +01:00
889f059758 All tests passed! 2014-10-30 21:51:59 +01:00
45a8ed6531 Huge refactoring in progress... 2014-10-30 15:31:27 +01:00
4c204840e9 Huge refactoring in progress... 2014-10-30 14:03:33 +01:00
c3001e9ea9 Huge refactoring in progress... 2014-10-30 10:49:02 +01:00
5cf744dbac Huge refactoring in progress... 2014-10-29 21:18:27 +01:00
ba2b142c8a Huge refactoring in progress... 2014-10-29 14:24:34 +01:00
10ab95522d Epic refactoring in progress 2014-10-28 17:58:46 +01:00
61218f12fd Epic refactoring in progress... 2014-10-28 16:29:55 +01:00
852256c1af Epic refactoring int progress... 2014-10-27 22:50:50 +01:00
8988cb4761 Epic refactoring in progress... 2014-10-27 14:03:44 +01:00
e0980292ef Epic refactoring in progress 2014-10-26 21:18:09 +01:00
cdf3777aa8 Removed unused friend 2014-10-25 21:02:56 +02:00
618a54579f Simplified JsonArray 2014-10-25 21:02:13 +02:00
9f69fabe20 Cleaned JsonNodeWrapper 2014-10-25 16:11:04 +02:00
e748ce32bc Removed all friends of JsonValue 2014-10-25 15:55:58 +02:00
fdeedabfd7 Fixed warning in Visual Studio 2014-10-24 19:59:14 +02:00
582216e004 Merged JsonArrayIterator and JsonObjectIterator into a one template class 2014-10-24 18:53:03 +02:00
1f6cd8e56e Removed usages of JsonNodeIterator 2014-10-24 18:31:50 +02:00
68fb03577c Moved forward declarations in a single .hpp file 2014-10-24 16:29:51 +02:00
bbef8931a6 Improved JsonArrayIterator 2014-10-24 16:12:05 +02:00
8071434515 Fixed many cpplint warnings 2014-10-24 00:08:25 +02:00
7f22a1ab39 Muted a few cpplint warnings 2014-10-23 23:59:05 +02:00
55b0eab3e6 Added newline at ed of file 2014-10-23 23:45:36 +02:00
e85f27c0f3 Added file headers with copyrights 2014-10-23 23:39:22 +02:00
e3b4f5038d Fixed path of test exe 2014-10-23 23:22:26 +02:00
b43da1e421 Switched to Google coding style to match cpplint expectations 2014-10-23 23:13:13 +02:00
5c8283b3e4 Added cpplint 2014-10-23 23:10:22 +02:00
3dc533fca0 Merge pull request #30 from ivankravets/patch-2
Avoid trademark issues with library name
2014-10-23 22:29:42 +02:00
d38cbd374a Avoid trademark issues with library name
Added frameworks and platforms fields
Updated Library Registry: http://platformio.ikravets.com/#!/lib/show/64/Json
2014-10-23 22:27:22 +03:00
9175046f35 Formated code with clang-format 2014-10-23 19:54:00 +02:00
888fdc1d54 Improved JsonObjectIterator 2014-10-23 18:56:04 +02:00
d83f1a6319 Added .hpp files 2014-10-23 18:22:50 +02:00
ff5f3f3a2c Merge branch 'merge-parser-and-generator' of github.com:bblanchon/ArduinoJson into merge-parser-and-generator
Conflicts:
	test/JsonObject_Iterator_Tests.cpp
2014-10-23 17:43:40 +02:00
e4779512e6 Added JsonValue::as<T>() 2014-10-23 17:22:23 +02:00
8947a6c9de Added more tests 2014-10-23 17:01:24 +02:00
fa805b4998 Test parsing of nested objects 2014-10-23 12:15:46 +02:00
451c0ee70d Added JsonObjectIterator::operator->() 2014-10-22 23:32:25 +02:00
40ac60b941 Added JsonObjectIterator 2014-10-22 21:56:38 +02:00
7e98d136f4 Added more warning flags for GCC (as suggested in issue #28) 2014-10-22 21:25:19 +02:00
c800948342 Fixed warning in GCC 2014-10-22 20:51:29 +02:00
7fbc3cb6a6 Fixed warnings in Visual Studio 2014-10-22 20:48:20 +02:00
d842e246c9 Added JsonArrayIterator 2014-10-22 17:59:59 +02:00
9946abf731 Added more tests 2014-10-22 16:04:29 +02:00
1e0464f5b4 Fixed negative number parsing 2014-10-22 15:57:50 +02:00
5aefc7d652 Simplified the parser 2014-10-22 12:25:41 +02:00
743381de6d Added 3 tests 2014-10-22 11:56:40 +02:00
d70ff26164 Remove support of unquoted keys 2014-10-22 11:54:33 +02:00
316d036785 More test on object parsing 2014-10-22 10:55:36 +02:00
c82e6d747b Test with spaces in objects 2014-10-21 23:42:26 +02:00
04330a7a47 Parse key value pairs 2014-10-21 23:40:04 +02:00
cfbe50057a Test with a missing closing brace 2014-10-21 21:50:00 +02:00
9c1b6b80aa Parse empty object 2014-10-21 21:11:30 +02:00
0daf82eee2 Renamed all .h files into .hpp (so that Sublime Text selects C++ syntax) 2014-10-19 15:46:36 +02:00
074c39ca5b Fixed namespaces 2014-10-18 23:05:54 +02:00
1abb8ac6ae Added tests of the trailing string 2014-10-18 22:25:48 +02:00
b19a37538c Changed JsonParser_String_Tests into QuotedString_ExtractFrom_Tests 2014-10-18 22:12:43 +02:00
fc4faacfec Renamed EscapedString into QuotedString 2014-10-18 22:04:13 +02:00
bbc2aa4f2a Allow string to be enclosed in single quotes 2014-10-18 21:54:32 +02:00
1f6bd5c04d Added more test of escaped chars 2014-10-17 22:32:55 +02:00
32ffb75394 Fixed compilation warning 2014-10-17 21:51:58 +02:00
7df73824aa Fixed field orders 2014-10-17 20:57:38 +02:00
9c32ae2300 Parser: unescape strings 2014-10-17 20:52:27 +02:00
b15dac7edf Renamed EscapedStringTests into EscapedString_PrintTo_Tests 2014-10-17 12:53:38 +02:00
2a62132bf0 Added JsonParser_String_Tests.cpp 2014-10-16 22:13:31 +02:00
a0a82c0f4e Renamed file 2014-10-16 21:43:44 +02:00
24b46af48a Moved build output to bin/ and lib/ 2014-10-16 21:29:59 +02:00
fed79bfd81 Updated the script to work on Windows too 2014-10-16 21:06:13 +02:00
7dbaac1070 Added a new script to create build environments 2014-10-16 18:23:41 +02:00
58d2c4a62f Renamed srcs/ into src/ 2014-10-16 16:25:42 +02:00
b847576bb4 Renamed tests/ into test/ 2014-10-16 16:23:24 +02:00
58f155e135 Moved .h files to include/ 2014-10-16 00:11:23 +02:00
241ca79114 Parse simple strings 2014-10-15 23:39:25 +02:00
3d92531ad3 Parse 'null' 2014-10-15 23:27:38 +02:00
c61ee09d26 Parse booleans 2014-10-15 23:10:52 +02:00
c59ddd8a9d Fixed number of tokens (issue #29) 2014-10-15 16:31:20 +02:00
086d07151f Parse doubles 2014-10-15 14:54:31 +02:00
a1cb9c9399 Added methods to clarify the tests 2014-10-15 13:51:20 +02:00
f265b6ed11 Fixed compilation warnings 2014-10-14 21:57:34 +02:00
5db34580f2 Added test for spaces in arrays 2014-10-14 21:50:51 +02:00
beb49a9446 Parse an array with two longs 2014-10-14 21:48:22 +02:00
ee205971e9 Test what happens with just an opening bracket 2014-10-14 21:35:47 +02:00
ded6364e1d Moved the location of the VS files 2014-10-14 21:24:40 +02:00
5b6b38564f Parse long values 2014-10-14 21:24:26 +02:00
31c1a3d804 Added a script to create Sublime Text project 2014-10-14 18:02:24 +02:00
81f3460806 Parse empty array with leading spaces 2014-10-14 18:01:49 +02:00
081b345e7c Parse invalid array 2014-10-14 17:28:57 +02:00
f468db6757 Parse empty array 2014-10-14 17:16:21 +02:00
c7dcf864cc Added *.h files 2014-10-14 13:55:07 +02:00
6d39bfa703 Added a script to generate VS solution 2014-10-14 12:31:08 +02:00
4ee1ac015f Created scripts/ 2014-10-14 12:23:40 +02:00
b2e2556ef6 Removed Visual Studio project files 2014-10-14 12:22:17 +02:00
8f74e4e44e Splitted CMakeLists.txt 2014-10-14 11:01:50 +02:00
be891daa5a Added CMakeLists.txt 2014-10-14 09:52:04 +02:00
95a2d6714e Fix minor issues for GCC 2014-10-14 09:50:58 +02:00
3ce5e53323 Removed duplicate code of v3 2014-10-13 21:27:56 +02:00
f8c3cdf2ff Fixed mistakes in the tests 2014-10-13 21:03:32 +02:00
88aed98447 Fixed JsonContainer::operator== 2014-10-13 21:01:11 +02:00
3ae90b66c6 Added tested for createNestedArray() and createNestedObject() 2014-10-13 18:12:23 +02:00
10c0a8ba70 Ported tests of issue #10 2014-10-13 17:56:16 +02:00
d192a14e2e Fixed compiler warning 2014-10-11 16:59:16 +02:00
b49aa22c65 Replaced non-const references by pointer to follow Google style guide 2014-10-11 16:58:24 +02:00
dae0dc5ebb Replaced old style casts (issue #28) 2014-10-10 18:44:04 +02:00
35eaa55b3a Added JSON_PROXY to copy arrays and objects by reference 2014-10-09 18:20:40 +02:00
bf2d726746 Minor changes 2014-10-09 14:48:55 +02:00
0dce0022d3 Made JsonNodeType private 2014-10-09 14:31:25 +02:00
1bff34a204 Made JsonNode::next private 2014-10-09 14:19:43 +02:00
24c60619d5 Made JsonNode::type private 2014-10-09 14:17:09 +02:00
b0e12e8852 Refactoring JsonNode... 2014-10-09 12:14:10 +02:00
f7fa9e9467 Added JsonArray::createNestedObject() 2014-10-07 15:27:24 +02:00
09b6f71853 Added JsonObject::createNestedArray() 2014-10-07 12:11:10 +02:00
e28119f03b Test JsonObject::prettyPrintTo() 2014-10-07 11:58:59 +02:00
7a40711af3 Added JsonContainer::prettyPrintTo() 2014-10-07 11:22:10 +02:00
b6799dc231 Refactored the serialization 2014-10-05 16:26:13 +02:00
31c9ea9b28 Test JsonArray serialization 2014-10-05 15:23:52 +02:00
6330ab1271 Test that JsonObject can contain inner arrays 2014-10-05 15:15:25 +02:00
c35a0fadc3 Test that JsonArray can contain inner objects 2014-10-05 15:14:29 +02:00
bbe034222c Test that JsonArray can contain inner arrays 2014-10-05 15:13:00 +02:00
305944e907 Test that JsonArray can store strings 2014-10-05 15:04:44 +02:00
f0754aed53 Test that JsonArray can store booleans 2014-10-05 15:04:17 +02:00
99a785179d Test that JsonArray can contain doubles 2014-10-05 15:02:40 +02:00
21259bc61a Test that JsonArray can store integers 2014-10-05 14:55:14 +02:00
4c67d0579a Test that JsonArray grows after calling add() 2014-10-05 14:48:19 +02:00
cb3c59ec07 Added JsonArray 2014-10-05 14:40:03 +02:00
e725b756a6 Merge pull request #27 from ivankravets/patch-1
PlatformIO-based manifest file
2014-10-04 10:31:15 +02:00
dbe6f89ed8 PlatformIO-based manifest file
Web: http://platformio.ikravets.com/#!/lib/show/Arduino-Json
Docs: http://docs.platformio.ikravets.com/en/latest/librarymanager/index.html
2014-10-03 22:06:24 +03:00
84e34d2a27 Added content of issue #26 in the testimonials 2014-10-03 10:06:52 +02:00
4d2d535a03 Pulled up code from JsonObject to JsonContainer 2014-10-01 16:56:22 +02:00
b0e43f7538 Extracted class JsonContainer 2014-10-01 16:18:14 +02:00
d66a7adc22 Moved files into Internals/ and Arduino/ 2014-10-01 16:08:32 +02:00
1a98fd5dfc Serialize inner objects 2014-10-01 15:47:32 +02:00
57400cee14 Extracted methods serializeObject and serializeKeyValue 2014-10-01 12:46:41 +02:00
c99bdbf4b9 Extracted JsonNodeSerializer 2014-10-01 12:28:30 +02:00
a665fa1dec Converted StringBuilder tests to gtest 2014-09-30 18:07:08 +02:00
78048d1d92 Converted EscapedString tests to gtest 2014-09-30 18:03:17 +02:00
065fe57a7c Serialize booleans in objects 2014-09-30 17:56:28 +02:00
f251563af1 Serialize floats in objects 2014-09-30 17:32:45 +02:00
c1ab55f9d9 Serialize integer values in object 2014-09-30 17:24:14 +02:00
27a4d57f7c Test that now value can be added when all nodes are allocated 2014-09-30 17:14:59 +02:00
22e36bbe9c Restored tests from previous test suite 2014-09-30 17:08:59 +02:00
d2e1b241be Test that size doesn't change when remove() is called with an invalid key 2014-09-30 17:07:29 +02:00
3d9e40a3a8 Test that the size is decreased when object are removed 2014-09-30 17:05:33 +02:00
9f85368cce Test serialization of an object with strings 2014-09-30 16:59:44 +02:00
3243f2dc58 Implement Printable 2014-09-30 16:43:25 +02:00
6b2705769a Refactored to use StringBuilder 2014-09-30 16:40:00 +02:00
ab2587f089 Test empty object serialization 2014-09-30 16:31:22 +02:00
d3cf568d07 Test that char* are copied 2014-09-28 21:35:08 +02:00
e417c137fc Test that bool values are copied 2014-09-28 21:23:40 +02:00
d549070fd3 Test that doubles in JsonValue are copied 2014-09-28 21:22:20 +02:00
42ce5ab31f Test that integers in JsonValue are copied 2014-09-28 21:18:43 +02:00
e190b20ae1 Fixed inner object bug 2014-09-28 21:04:59 +02:00
ce788d96c4 Changed naming convention to avoid shadowing (issue #25) 2014-09-28 13:36:41 +02:00
cc19266470 Added missing newline at end-of-file (issue #24) 2014-09-27 21:24:29 +02:00
18f93b4eb6 Fixed issue #22 2014-09-27 21:02:43 +02:00
e682ed5a1e Added a test prooving issue #22 2014-09-27 21:02:43 +02:00
bc44c36385 Test that nested JsonObject can be stored 2014-09-27 16:18:40 +02:00
bcc8cece24 Moved JsonObject._buffer into the JsonNode's content 2014-09-27 15:34:34 +02:00
a7ff04db0e Added "const" to cast operators 2014-09-27 15:25:00 +02:00
a9a51ec1e2 Test that string can be stored in JsonObject 2014-09-27 15:24:16 +02:00
0495297c6c Group test in a test fixture 2014-09-27 15:19:03 +02:00
75588946c6 Test that boolean values can be stored in a JsonObject 2014-09-27 15:04:06 +02:00
5fa446d3f5 Test that a double can be stored in a JsonObject 2014-09-27 14:59:02 +02:00
71fd2de675 Test that integers can be stored in a JsonObject 2014-09-27 14:51:50 +02:00
a2fc188526 Test that adding the same value twice doesn't increase the size of the object 2014-09-27 14:43:19 +02:00
166bdd6919 Test that adding values to the JsonObject increase the size of the buffer 2014-09-27 12:16:53 +02:00
4d4119e589 Test that JsonObject.size() is increased when values are added 2014-09-27 11:53:26 +02:00
91649df593 Test that CreateObject() returns an empty JsonObject 2014-09-27 11:42:27 +02:00
890e811e80 Test that size can't go above capacity 2014-09-27 11:33:45 +02:00
bb887f94e7 Test size() after calling CreateObject 2014-09-27 10:16:30 +02:00
6e45f7c790 Test initial size of StaticJsonB 2014-09-27 09:58:34 +02:00
5580adb4a6 Added first test on StaticJsonBuffer 2014-09-27 09:56:53 +02:00
60a5d72367 Started a new solution from scratch.
Added Google test
2014-09-24 11:41:19 +02:00
4cfb0ab84d Fixed issue #21 2014-09-20 18:56:22 +02:00
a1b6c2df75 Merge branch 'parse-escaped-chars' 2014-09-09 21:33:12 +02:00
feb6060887 Updated change-log 2014-09-09 21:32:27 +02:00
49d2b4b2a2 Updated code size 2014-09-09 21:25:25 +02:00
286a514fbe Minor clean up 2014-09-09 21:23:37 +02:00
9d3b522e7b Reduced code size (-6 bytes) 2014-09-07 20:11:33 +02:00
c32642e130 Reduced code size (-6 bytes) 2014-09-07 19:55:54 +02:00
7a3fa35bd8 Added LICENSE.md 2014-09-06 12:04:09 +02:00
0154fc15cb Added escaped char replacement 2014-09-04 21:49:43 +02:00
24d173c3b9 Added tests of escaped chars 2014-09-04 21:30:50 +02:00
d4c1b6f2c2 Extracted a class to test strings 2014-09-04 21:20:40 +02:00
58c051f564 Added comments 2014-09-01 21:36:09 +02:00
763aa7fe37 Added an overload of prettyPrintTo() 2014-09-01 21:22:56 +02:00
cd88fb0882 Added prettyPrintTo() 2014-09-01 21:22:34 +02:00
ec843659d8 Updated CHANGELOG.md 2014-09-01 21:14:09 +02:00
2997a405a0 Added IndentedPrint example 2014-08-26 12:48:59 +02:00
57f28c2017 Reduced code size 2014-08-26 12:11:17 +02:00
b3b70b78cf Fixed build error in Arduino IDE 2014-08-26 12:03:50 +02:00
48018bd6e6 Set default tab size to 2 2014-08-26 11:59:41 +02:00
61952a9bcd Added setTabSize() 2014-08-26 11:58:33 +02:00
602cc104f9 Set line ending to CR LF, like in Arduino source code 2014-08-26 11:52:12 +02:00
d71a39211d Fixed prettyPrintTo calling printTo 2014-08-26 10:26:40 +02:00
f77a8b02e3 Fixed file names 2014-08-26 10:26:12 +02:00
aa2cd0db00 Moved IndentedPrint into the namespace ArduinoJson::Generator 2014-08-26 10:16:13 +02:00
f127ef6019 Refactoring... 2014-08-26 10:13:49 +02:00
3ae7327687 Renamed PrettyPrintDecorator into JsonPrettyPrint 2014-08-26 10:08:54 +02:00
23e61cc0f7 Renamed IndentedPrintDecorator into IndentedPrint 2014-08-26 09:56:05 +02:00
b5002265cf Refactoring... 2014-08-26 09:53:32 +02:00
e48ea94789 Refactoring... 2014-08-26 09:49:59 +02:00
6539c6982c Extracted class IndentedPrintDecorator from PrettyPrintDecorator 2014-08-26 09:28:41 +02:00
d877d77b63 Moved PrettyPrintDecorator into the namespace ArduinoJson::Generator 2014-08-25 13:19:07 +02:00
1df6cde026 Refactoring... 2014-08-25 13:14:09 +02:00
fafae8181b Refactoring... 2014-08-25 12:51:56 +02:00
151fc52c1c Refactoring... 2014-08-25 12:48:38 +02:00
ea79340dc7 Refactoring... 2014-08-25 12:41:49 +02:00
9e88514700 Refactoring.... 2014-08-25 12:28:58 +02:00
752378a8cb Fixed bug when a string contains a brace 2014-08-25 12:23:08 +02:00
8465cc0c83 Refactoring... 2014-08-25 11:46:42 +02:00
2ddf8f1619 Renamed IndentedPrintDecorator to PrettyPrintDecorator 2014-08-25 11:42:07 +02:00
f7aa0f89e3 Added JsonPrintable.prettyPrintTo(Print&) 2014-08-25 11:39:04 +02:00
3d322fdb28 Test nested arrays 2014-08-25 11:02:38 +02:00
981adf1989 Test empty nested arrays 2014-08-25 11:01:22 +02:00
dbc3bee3a0 Test array with 2 elements 2014-08-25 10:55:48 +02:00
3f2b7b706a Test an array with one element 2014-08-25 10:55:09 +02:00
c243417585 Test nested objects 2014-08-25 10:46:43 +02:00
514a6c0879 Splitted the indentation tests into 3 files 2014-08-25 10:42:00 +02:00
76f9ecce75 Tests empty nested objects in objects 2014-08-25 10:36:25 +02:00
410ca55e88 Added a space before the object's values 2014-08-25 10:34:28 +02:00
66c05041e8 Test an object with comma, quote and column in the value 2014-08-25 10:31:03 +02:00
aafabd8e8d Test an object with two memebrs 2014-08-25 10:22:42 +02:00
eb1a774778 Fixed empty object output 2014-08-25 09:56:51 +02:00
75c89e7b35 Test an object with one member 2014-08-25 09:52:42 +02:00
e31a2136fc Test with an empty array 2014-08-25 09:24:31 +02:00
380722402f Added a test of an empty object 2014-08-25 09:23:41 +02:00
030c8542e7 Now also test the return value 2014-08-25 09:19:26 +02:00
1f25d4434e Added test of an empty string 2014-08-25 09:17:32 +02:00
f29904e217 Added skeleton of class IndentedPrintDecorator 2014-08-25 09:06:46 +02:00
7246db7691 Added a note to avoid issue #10 2014-08-04 15:12:09 +02:00
4bdbc6c1fc Updated CHANGELOG.md 2014-08-04 14:59:09 +02:00
8e6fdb20eb Added tag in filename 2014-08-04 14:56:19 +02:00
016d0d699e Added a script to create Arduino package 2014-08-04 14:47:32 +02:00
6771603a05 Simplified JsonArray tests 2014-08-04 12:18:17 +02:00
d067cf0e84 Fixed tests 2014-08-04 09:35:57 +02:00
13593d73a3 Fixed nested object in arrays bug 2014-08-04 09:30:57 +02:00
bc86ae800a Changed JsonArray tests to show the issue 2014-08-04 09:22:45 +02:00
df52dceaa1 Added tests for issue #10 2014-08-04 09:21:04 +02:00
d460b59b50 Fixed CHANGELOG.md 2014-08-03 15:54:16 +02:00
8e5ea91f8d Updated README 2014-08-03 13:48:22 +02:00
4a8b7d0cb4 Updated code size 2014-08-03 13:23:40 +02:00
96c9b5deee Updated changelog. 2014-08-03 13:18:59 +02:00
8e81b9bb26 Added JsonObjectBase::remove() 2014-08-03 13:16:35 +02:00
817cc09975 Added typedef JsonKey 2014-08-03 13:09:07 +02:00
1bc45f1fd7 Extracted method getMatchingPair() 2014-08-02 16:25:18 +02:00
d2fe9ddf49 Added JsonObjectBase::containsKey() 2014-08-02 16:11:02 +02:00
5cc06180e6 Removed JsonValue::null(), moved the instance to JsonObjectBase 2014-08-02 15:55:46 +02:00
65e8b6d405 Optimized size of JsonObjectBase indexer (-58 bytes) 2014-08-02 15:37:01 +02:00
09294cb5e6 Made EscapedString pure static 2014-08-01 15:32:05 +02:00
158f4600fb Added static EscapedString::printTo 2014-08-01 15:27:58 +02:00
0d28612507 Fixed casting JsonValue to string 2014-08-01 15:23:14 +02:00
7c99d4d63d Reduced usages of EscapedString 2014-08-01 15:22:30 +02:00
1a01800782 Test casting a JsonValue to a JsonArray 2014-08-01 15:06:31 +02:00
6384bc414a Test casting a JsonValue to a float 2014-08-01 14:58:16 +02:00
c10bcee324 Test casting a JsonValue to a double 2014-08-01 14:56:46 +02:00
028ff6676e Test casting a JsonValue to a bool 2014-08-01 14:54:34 +02:00
23b5237f74 Test casting a JsonValue to a long 2014-08-01 14:53:05 +02:00
88510705be Test casting a JsonValue to an int 2014-08-01 14:52:15 +02:00
15d3068d78 Test casting a JsonValue to a string 2014-08-01 14:47:48 +02:00
ae6beb9340 Cleaned JsonValue tests 2014-08-01 14:38:28 +02:00
c1f4128ccd Added a failng test 2014-08-01 14:35:54 +02:00
5fb6edfc91 Cleaned JsonObject unit tests 2014-08-01 14:25:55 +02:00
2771b830b7 Replace the examples with the new API 2014-07-31 20:33:12 +02:00
84aa627038 Updated changelog 2014-07-31 20:28:52 +02:00
4528b8fc95 Use operator[] in example (-68 bytes) 2014-07-31 20:16:14 +02:00
60c6f2db47 Added operator[] 2014-07-31 20:11:55 +02:00
13c386c7a3 Moved JsonValue to namespace ArduinoJson::Generator 2014-07-31 19:57:52 +02:00
7877ee1b4c Replaced set() by operator=() 2014-07-31 19:48:51 +02:00
2c29327ebd Return a JsonValue& instead of a KeyValuePair* (+40 bytes) 2014-07-31 19:42:09 +02:00
85ffb83aa6 Fixed failing test 2014-07-31 18:50:01 +02:00
1ce6661fa6 Created a failing test 2014-07-31 18:16:04 +02:00
68a2ca905e Updated README.md 2014-07-23 20:18:59 +02:00
7e4ab9f31c Added code size 2014-07-23 13:45:07 +02:00
44e5549456 Added code size 2014-07-23 13:29:56 +02:00
3e36831cdc Updated README.md 2014-07-23 12:56:42 +02:00
5129f3400c Added key() and value() shortcuts 2014-07-23 12:56:29 +02:00
0449ee4fd3 Updated README.md 2014-07-23 12:14:59 +02:00
6e4eb45210 Renamed JsonHashTable into JsonObject 2014-07-22 21:02:16 +02:00
abef85218e Renamed ARDUINO_JSON_NO_DEPRECATED_WARNING into ARDUINO_JSON_NO_DEPRECATION_WARNING 2014-07-22 20:33:17 +02:00
649f292ea7 Added comments 2014-07-22 20:28:59 +02:00
805c0741e6 Added comments 2014-07-22 20:14:25 +02:00
0fc54ba54c Added comments 2014-07-21 20:38:08 +02:00
df72419f09 Added comments 2014-07-21 15:20:02 +02:00
d3d0da2d7f Added comments 2014-07-21 14:17:27 +02:00
407d536e06 Added comments 2014-07-21 14:14:31 +02:00
c22473cf37 Removed unused stuff 2014-07-21 11:08:39 +02:00
3e8861b1a0 Moved implemntation of operator[] into JsonObject 2014-07-21 10:52:35 +02:00
f565a9b1b7 Created a Visual Studio project for JsonGenerator 2014-07-21 09:59:47 +02:00
06026cc7d4 Created a Visual Studio project for JsonParser 2014-07-21 09:54:26 +02:00
04f52733c2 Added a test with 3 strings 2014-07-19 16:15:57 +02:00
c06f42659a Updated README.md 2014-07-19 16:05:42 +02:00
e619b8f5bd Updated README.md 2014-07-19 15:57:03 +02:00
1e28217393 Merged parse() and parseToken() 2014-07-19 15:36:01 +02:00
a1e8c8800a Removed uneeded cast operators 2014-07-19 15:34:44 +02:00
00ad540f4e Updated CHANGELOG.md 2014-07-19 15:23:40 +02:00
cd7a7b1533 Fixed bug in JsonArray::begin() and end() 2014-07-19 14:55:16 +02:00
0fe77176e1 Fixed bug in JsonObject::begin() and end() 2014-07-19 14:49:59 +02:00
e94575b4b8 Replaced public inheritance by protected and private 2014-07-19 14:41:29 +02:00
b278d7711b Replaced composition by inheritance 2014-07-19 12:44:27 +02:00
851d21e08c Added JsonObjectIterator 2014-07-18 22:40:50 +02:00
b75d32e980 Renamed JsonHashTable into JsonObject 2014-07-18 16:46:01 +02:00
daa62b3737 Simplified nextSibling() 2014-07-18 16:22:09 +02:00
ed497df9d6 Added JsonToken.cpp 2014-07-18 16:19:14 +02:00
79953730fc Merged nestedTokenCount() and nextSibling() 2014-07-18 16:18:03 +02:00
5d2ffc49fd Fixed JsonArrayIterator unit test 2014-07-18 16:11:21 +02:00
714a37bd59 Replaced JsonToken operators by meaningful methods 2014-07-18 15:54:49 +02:00
4a1d8483cc Added class JsonToken 2014-07-18 15:43:20 +02:00
0d4d77a7cd Updated example 2014-07-17 14:02:51 +02:00
c329572d24 Added JsonArrayIterator (tests are failing) 2014-07-17 13:58:30 +02:00
ca01ecfb49 Added a flag to ignore deprecation warnings 2014-07-17 13:27:40 +02:00
78249a0ada Updated example 2014-07-17 13:23:32 +02:00
45c9ba1191 Renamed JsonObjectBase into JsonPrintable 2014-07-17 13:16:14 +02:00
5e1697f47b JsonArray is now a simple wrapper on top of JsonValue 2014-07-17 13:12:12 +02:00
f2579397d6 JsonHashTable is now a wrapper on to of JsonValue 2014-07-17 12:59:26 +02:00
b6e3a37ad9 Added JsonParserBase::parse() that returns a JsonValue 2014-07-17 12:37:35 +02:00
73eda08dd4 Updated example 2014-07-16 21:10:18 +02:00
6164328892 Renamed JsonArray::getLength() into size() to match std::vector 2014-07-16 14:01:04 +02:00
7487b8cbb7 Defined the DEPRECATED macro 2014-07-16 13:53:56 +02:00
6a868e46bd Made JsonValue inherit from JsonObjectBase 2014-07-16 13:42:36 +02:00
d189bd7140 Added class JsonValue.
Added subscript operator on JsonArray and JsonHashTable
2014-07-16 13:26:11 +02:00
9f07cdcabf Updated CHANGELOG.md 2014-07-15 20:04:21 +02:00
41b5bba939 Updated CHANGELOG.md 2014-07-15 13:50:49 +02:00
7ac4a91591 Added include of JsonParserBase.cpp 2014-07-15 12:56:14 +02:00
5534635feb Fixed case of jsmn.cpp (issue #6) 2014-07-15 12:54:01 +02:00
2e5b959e8b Fixed GCC warnings 2014-07-14 16:13:58 +02:00
9ee3dc638d Update parser size 2014-07-14 16:02:34 +02:00
ccb97fc6e0 Fixed bug JsonObjectBase::getNestedTokenCount() that reads uninitialized token 2014-07-14 15:52:26 +02:00
39c185ae67 Fixed bug in JsonObjectBase::getBoolFromToken() 2014-07-14 14:50:43 +02:00
cf1324c09b Added a test with too few tokens 2014-07-14 14:46:46 +02:00
0b087b7bdb Added a test when token count is too small 2014-07-14 14:35:51 +02:00
dde5a2510b Extracted class JsonParserBase 2014-07-14 13:17:30 +02:00
a42b03ec26 Rewrote tests on hash tables 2014-07-14 12:29:57 +02:00
2f98e59fc6 Cleaned the array tests 2014-07-14 11:48:46 +02:00
f58a8b0ca5 Renamed unit test classes 2014-07-14 10:33:24 +02:00
4f56afe89e Updated changelog 2014-07-09 19:50:44 +02:00
339de21f1c Updated code size 2014-07-09 19:48:55 +02:00
25c428c1e9 Removed useless cast 2014-07-09 13:44:11 +02:00
0045bb3e35 Reduced the size of JsonArrayBase::printTo() by 18 bytes 2014-07-09 13:40:09 +02:00
4e61a839a5 Minor changes 2014-07-09 13:30:08 +02:00
a48fbac7d7 Reduced the size of EscapedString::printTo() by 4 more bytes 2014-07-09 13:19:12 +02:00
af7dd55d34 Reduced the size of EscapedString::printTo() by 4 bytes 2014-07-09 13:16:10 +02:00
525649c416 Reduced the size of EscapedString::printTo() by 26 bytes 2014-07-09 12:59:49 +02:00
1f86016320 Extracted function getSpecialChar() 2014-07-09 12:50:03 +02:00
c38af3e32c Cleaned up 2014-07-08 21:29:19 +02:00
0a0757945e Reduced the size of JsonHashTableBase::printTo() by 12 bytes 2014-07-08 13:49:35 +02:00
e63cde3922 Reducted the size of JsonHashTableBase::printTo() by 18 bytes ! 2014-07-08 13:46:34 +02:00
5bb6cd0fa9 Extracted class JsonArrayBase to reduce code size 2014-07-08 13:38:37 +02:00
bbc18b5ca4 Extracted class JsonHashTableBase to reduce the size of the code. 2014-07-08 13:27:29 +02:00
6d3b70f4a3 Updated encoder size 2014-07-07 20:04:25 +02:00
cbedcdf93b Minor change 2014-07-07 19:50:19 +02:00
6fcf9edf9a Updated README.md 2014-07-07 16:23:54 +02:00
bb11fcba89 Updated the example. 2014-07-07 16:22:43 +02:00
a87b2bf5bf Adde EscapedString to the cpp files 2014-07-07 16:21:34 +02:00
f28997e367 Added a work around for Arduino 1.0.5 2014-07-07 16:21:19 +02:00
42968be535 Updated type sizes 2014-07-07 14:07:24 +02:00
6c1ab912ff Added namespace ArduinoJson::Internals for private types 2014-07-07 14:05:41 +02:00
99521cc718 Removed default template value for DIGITS, because Arduino 1.0.5 refused it 2014-07-07 13:59:31 +02:00
b3613f7137 Use EscapedString for keys in JsonHashTable 2014-07-07 13:48:50 +02:00
1b62502b36 Extracted class EscapedString 2014-07-07 13:38:35 +02:00
adb8fa4d44 Set a default value for DIGITS 2014-07-07 13:28:31 +02:00
3b6ce65054 Reduced the size of JsonValue to 6 bytes ! 2014-07-07 13:27:12 +02:00
be6c4bf4d1 Number of digits is now a template parameter 2014-07-07 13:24:14 +02:00
4e6ad31d6a Reduced the size of JsonValue by removing the pointer to instance methods. 2014-07-06 21:34:46 +02:00
1cec019457 Reduce the size of JsonValue by removing the virtual 2014-07-06 21:28:39 +02:00
2e97dbdedc Reduced the size of JsonValue by no implementing Printable 2014-07-06 21:08:04 +02:00
8f9d3b638f Removed content.asFloat 2014-07-06 20:36:11 +02:00
8be590e591 Added README.md 2014-07-06 14:47:50 +02:00
8baf21b6e8 Minor changes 2014-07-05 21:39:56 +02:00
935cb068ab Updated README.md 2014-07-05 16:09:37 +02:00
efd8c0ff5c Improved the example 2014-07-05 13:10:07 +02:00
757c86ddc5 Simplified the example 2014-07-05 13:09:46 +02:00
0efe8bc74a Added encoder sizes 2014-07-05 12:53:34 +02:00
65d03c9001 Fixed table 2014-07-04 19:15:19 +02:00
df2e640b16 Added README.md 2014-07-04 19:11:04 +02:00
895482de15 Merged the two Visual Studio solutions into one 2014-07-04 14:48:18 +02:00
477c9c2c6e Updated changelog 2014-07-04 14:42:57 +02:00
50b2a1b4a7 Added namespace for the parser 2014-07-03 14:01:45 +02:00
78a920a5fc Now use #pragma once 2014-07-03 13:58:08 +02:00
bae5c36f41 Added namespace 2014-07-03 13:55:38 +02:00
538b15b400 Updated Arduino example 2014-07-03 13:48:11 +02:00
daba65d987 Added overload to add() to specify the double precision 2014-07-03 13:45:53 +02:00
5b1c2047a4 Renamed Print::write() into print() 2014-07-03 13:38:58 +02:00
81c7b9f700 Can now set the double value precision. 2014-07-03 13:35:39 +02:00
2222714d68 Moved sprintf() calls to Print.cpp 2014-07-03 13:21:40 +02:00
dd5cf661e3 Moved Print::write() implementation into Print.cpp 2014-07-03 12:55:53 +02:00
b560a87e15 Change unit tests relying on floating point precision 2014-07-03 12:54:41 +02:00
4d4d775e7a Renamed private method 2014-07-03 12:41:22 +02:00
9bcb5610e8 Updated the changelog 2014-07-02 13:59:13 +02:00
cb0973ab38 Updated Arduino example 2014-07-02 13:54:39 +02:00
c7fb77203b Replace C++11 syntax that what not supported by the Arduino IDE 2014-07-02 13:49:23 +02:00
e87bde6594 Added a JsonValue constructor for float 2014-07-02 13:46:25 +02:00
922b131f8d Splitted the special char tests 2014-07-02 13:24:33 +02:00
ae73a06328 Extracted class StringBuilderTests 2014-07-02 13:16:44 +02:00
61e53a505d Added a test that stores an integer in a JsonValue 2014-07-02 13:06:38 +02:00
937837848c Added a test that stores a long in a JsonValue 2014-07-02 13:02:28 +02:00
1fba9767d3 Renamed private methods 2014-07-02 12:54:22 +02:00
621068260d Renamed union members 2014-07-02 12:52:22 +02:00
e8831c28d9 Added JsonGenerator example for Arduino 2014-07-01 14:08:15 +02:00
a9b8e280fe Moved implementation is a new folder 2014-07-01 13:50:54 +02:00
4d5a7114c1 Added interface Printable. 2014-07-01 13:44:36 +02:00
c3359d3eb9 Renamed JsonSink into Print 2014-07-01 13:36:22 +02:00
c84860e3f4 Renamed JsonSink::append() into write() to match Arduino's Print class 2014-07-01 13:33:00 +02:00
1401665129 Added tests of writeTo() return value 2014-07-01 13:29:54 +02:00
19e007c3f5 Added tests of writeTo() return value 2014-07-01 13:25:21 +02:00
88f630cee5 Added tests on returned value. 2014-07-01 13:20:47 +02:00
a57220debc Changed JsonSink to match Arduino's Print class 2014-07-01 13:15:50 +02:00
69d682ce81 Extracted interface JsonSink. 2014-06-30 19:19:39 +02:00
81f7849c26 Got rid of the switch/case in JsonValue 2014-06-30 18:37:54 +02:00
10068e7b22 Added a test of an empty hash table in a hash table 2014-06-30 12:49:12 +02:00
5b2ee9ed29 Added a test of an empty array in a hash 2014-06-30 12:47:53 +02:00
93ddb9498e Added tests that adds a boolean to a hash table 2014-06-27 13:59:11 +02:00
495efd8629 Added a test that adds a null in a hash table 2014-06-27 13:57:06 +02:00
f548093d86 Added a test of one number in a hash table 2014-06-27 13:54:51 +02:00
5f77949636 Added a test of one string over hash table's capacity 2014-06-27 13:53:55 +02:00
e26cea59e5 Added a test with two strings in a hash table 2014-06-27 13:52:01 +02:00
1800a8e89e Added a test of a nested hash table in an array 2014-06-27 13:49:03 +02:00
1d064d709b Removed the overloads of add() by using a templated type 2014-06-27 13:45:50 +02:00
b7933f85ba Renamed addItem() to add() 2014-06-27 13:43:26 +02:00
0240270492 Extracted class JsonValue 2014-06-27 13:42:26 +02:00
dd8baea373 Fixed the failing tests 2014-06-27 13:24:10 +02:00
568b8988d8 Renamed private members 2014-06-27 13:18:38 +02:00
4f4b35bd41 Small refactoring of the tests 2014-06-27 13:09:52 +02:00
ff4060f5d1 Added a test that adds a string value in a hash 2014-06-27 13:07:38 +02:00
ebb257df6e Added a test of an empty hashtable 2014-06-27 13:00:27 +02:00
48a91a219c Moved writeTo to JsonObjectBase 2014-06-26 13:39:05 +02:00
e75e3b6527 Delete empty file 2014-06-26 13:30:18 +02:00
63ae9ef096 Moved floating point formatting to StringBuilder 2014-06-26 13:28:42 +02:00
33508e3fe0 Minor simplifications 2014-06-26 13:18:28 +02:00
1c4d4bfd2d Added a test with a NULL string 2014-06-26 13:16:22 +02:00
18587d132b Added a test with a NULL string 2014-06-26 13:14:09 +02:00
d12e25bd8a Added a test with special chars 2014-06-26 13:10:52 +02:00
25118ad8c0 Added a test class for StringBuilder.appendEscaped() 2014-06-26 13:05:49 +02:00
7ab728e996 Added a test that appends a string longer that the capacity of the builder 2014-06-26 13:00:14 +02:00
ca99749f28 Added a test that appends 2 string 2014-06-26 12:56:30 +02:00
55487ad668 Added a test that appends special chars 2014-06-26 12:55:40 +02:00
6ea9574330 Added a test that append a normal string 2014-06-26 12:53:58 +02:00
1e44f5522e Added a test that appends an empty string 2014-06-26 12:52:56 +02:00
786fe994aa Added a test class for StringBuilder 2014-06-26 12:50:48 +02:00
6b61617133 Added a test that adds a string with a backslash in it 2014-06-25 13:55:18 +02:00
45dfdbd5e4 Added method appendFormatted() 2014-06-25 13:50:28 +02:00
dd6fd6f198 Added a tests of a string with a double quote in it 2014-06-25 13:47:28 +02:00
ca53abdc41 Moved implementation to the .cpp file 2014-06-25 13:34:47 +02:00
5e4c4a4bdc Renamed the inner types 2014-06-25 13:33:19 +02:00
aa6cf308db Added a test that adds a nested array to an array 2014-06-25 13:31:05 +02:00
b8df795cb5 Added a test that adds a empty nested array in an array 2014-06-25 13:28:56 +02:00
4c387e9062 Extracted base class JsonObjectBase 2014-06-25 13:23:08 +02:00
d57234e92c JsonArray: extracted methods addItem 2014-06-25 13:14:10 +02:00
6f247a5080 Extracted class StringBuilder 2014-06-25 13:02:39 +02:00
d306422ed9 Replace single quotes by double quotes 2014-06-24 21:28:02 +02:00
2a20c5a25c Added a tests that adds a 'null' to an array 2014-06-24 21:24:38 +02:00
1118dd7b53 Added a test that adds a boolean to a full array 2014-06-24 21:19:05 +02:00
3d4f0f741d Added a test that adds two booleans to an array 2014-06-24 21:18:12 +02:00
77a3e1737d Added a test that adds a 'false' to an array 2014-06-24 21:17:12 +02:00
a27bb3097a Generator: added a tests that adds a 'true' to an array 2014-06-24 21:15:07 +02:00
5c119099f3 Generator: added a test of an array with too many numbers 2014-06-24 21:09:25 +02:00
bb705bab63 Generator: added a test with two numbers in an array 2014-06-24 21:07:17 +02:00
22ca52326c Generator: added a test of a float in an array 2014-06-24 13:53:30 +02:00
aa8cff7101 Generator: added a test of a full array 2014-06-24 13:38:48 +02:00
df25a21050 Generator: added a test of an array with 2 strings 2014-06-24 13:36:40 +02:00
f18f554c2f Generator: added a test of one string in an array 2014-06-24 13:34:55 +02:00
c8c1add4ab Generator: added empty array test 2014-06-24 13:19:23 +02:00
3d8b31b1ec Moved all JsonParser code in a sub-folder. 2014-06-24 13:14:07 +02:00
227 changed files with 25505 additions and 1908 deletions

5
.clang-format Normal file
View File

@ -0,0 +1,5 @@
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
BasedOnStyle: Google
Standard: Cpp03
AllowShortFunctionsOnASingleLine: Empty

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
*.sh text eol=lf

14
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,14 @@
<!--
Before opening an issue, please read the FAQ:
https://arduinojson.org/faq/
Please provide all the relevant information:
* good title
* short description of the problem
* target platform
* compiler model and version
* MVCE (https://stackoverflow.com/help/mcve)
* compiler output
Good questions get fast answers!
-->

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
.DS_Store
/.idea
/build
/bin
/lib
/sftp-config.json
.tags
.tags_sorted_by_file
/fuzzing/*_fuzzer
/fuzzing/*_fuzzer.options
/fuzzing/*_fuzzer_seed_corpus.zip

6
.mbedignore Normal file
View File

@ -0,0 +1,6 @@
.github/
examples/
fuzzing/
scripts/
test/
third-party/

96
.travis.yml Normal file
View File

@ -0,0 +1,96 @@
sudo: false
language: cpp
matrix:
include:
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.4']
env: SCRIPT=cmake GCC=4.4
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.6']
env: SCRIPT=cmake GCC=4.6
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.7']
env: SCRIPT=cmake GCC=4.7
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.8']
env: SCRIPT=cmake GCC=4.8 SANITIZE=address
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.9']
env: SCRIPT=cmake GCC=4.9 SANITIZE=leak
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-5']
env: SCRIPT=cmake GCC=5 SANITIZE=undefined
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-6']
env: SCRIPT=cmake GCC=6
- compiler: gcc
addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-7']
env: SCRIPT=cmake GCC=7
- compiler: clang
env: SCRIPT=cmake
- compiler: clang
addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.5']
packages: ['clang-3.5']
env: SCRIPT=cmake CLANG=3.5 SANITIZE=address
- compiler: clang
addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.6']
packages: ['clang-3.6']
env: SCRIPT=cmake CLANG=3.6 SANITIZE=leak
- compiler: clang
addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.7']
packages: ['clang-3.7']
env: SCRIPT=cmake CLANG=3.7
- compiler: clang
addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.8']
packages: ['clang-3.8']
env: SCRIPT=cmake CLANG=3.8 SANITIZE=undefined
- compiler: gcc
env: SCRIPT=coverage
- os: osx
osx_image: xcode6.4
compiler: clang
env: SCRIPT=cmake
- os: osx
osx_image: xcode7.3
compiler: clang
env: SCRIPT=cmake SANITIZE=address
- env: SCRIPT=arduino VERSION=1.6.7 BOARD=arduino:avr:uno
- env: SCRIPT=arduino VERSION=1.8.2 BOARD=arduino:avr:uno
- env: SCRIPT=platformio BOARD=uno
- env: SCRIPT=platformio BOARD=esp01
cache:
directories:
- "~/.platformio"
script: scripts/travis/$SCRIPT.sh

5
ArduinoJson.h Normal file
View File

@ -0,0 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#include "src/ArduinoJson.h"

View File

@ -1,18 +1,457 @@
ArduinoJsonParser change log
============================
ArduinoJson: change log
=======================
v1.2
v5.13.0
-------
* Changed the rules of string duplication (issue #658)
* `RawJson()` accepts any kind of string and obeys to the same rules for duplication
* Changed the return type of `strdup()` to `const char*` to prevent double duplication
* Marked `strdup()` as deprecated
> ### New rules for string duplication
>
> | type | duplication |
> |:---------------------------|:------------|
> | const char* | no |
> | char* | ~~no~~ yes |
> | String | yes |
> | std::string | yes |
> | const __FlashStringHelper* | yes |
>
> These new rules make `JsonBuffer::strdup()` useless.
v5.12.0
-------
* Added `JsonVariant::operator|` to return a default value (see below)
* Added a clear error message when compiled as C instead of C++ (issue #629)
* Added detection of MPLAB XC compiler (issue #629)
* Added detection of Keil ARM Compiler (issue #629)
* Added an example that shows how to save and load a configuration file
* Reworked all other examples
> ### How to use the new feature?
>
> If you have a block like this:
>
> ```c++
> const char* ssid = root["ssid"];
> if (!ssid)
> ssid = "default ssid";
> ```
>
> You can simplify like that:
>
> ```c++
> const char* ssid = root["ssid"] | "default ssid";
> ```
v5.11.2
-------
* Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561)
* Fixed incorrect rounding for float values (issue #588)
v5.11.1
-------
* Removed dependency on `PGM_P` as Particle 0.6.2 doesn't define it (issue #546)
* Fixed warning "dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]"
* Fixed warning "floating constant exceeds range of 'float' [-Woverflow]" (issue #544)
* Fixed warning "this statement may fall through" [-Wimplicit-fallthrough=] (issue #539)
* Removed `ARDUINOJSON_DOUBLE_IS_64BITS` as it became useless.
* Fixed too many decimals places in float serialization (issue #543)
v5.11.0
-------
* Made `JsonBuffer` non-copyable (PR #524 by @luisrayas3)
* Added `StaticJsonBuffer::clear()`
* Added `DynamicJsonBuffer::clear()`
v5.10.1
-------
* Fixed IntelliSense errors in Visual Micro (issue #483)
* Fixed compilation in IAR Embedded Workbench (issue #515)
* Fixed reading "true" as a float (issue #516)
* Added `ARDUINOJSON_DOUBLE_IS_64BITS`
* Added `ARDUINOJSON_EMBEDDED_MODE`
v5.10.0
-------
* Removed configurable number of decimal places (issues #288, #427 and #506)
* Changed exponentiation thresholds to `1e7` and `1e-5` (issues #288, #427 and #506)
* `JsonVariant::is<double>()` now returns `true` for integers
* Fixed error `IsBaseOf is not a member of ArduinoJson::TypeTraits` (issue #495)
* Fixed error `forming reference to reference` (issue #495)
> ### BREAKING CHANGES :warning:
>
> | Old syntax | New syntax |
> |:--------------------------------|:--------------------|
> | `double_with_n_digits(3.14, 2)` | `3.14` |
> | `float_with_n_digits(3.14, 2)` | `3.14f` |
> | `obj.set("key", 3.14, 2)` | `obj["key"] = 3.14` |
> | `arr.add(3.14, 2)` | `arr.add(3.14)` |
>
> | Input | Old output | New output |
> |:----------|:-----------|:-----------|
> | `3.14159` | `3.14` | `3.14159` |
> | `42.0` | `42.00` | `42` |
> | `0.0` | `0.00` | `0` |
>
> | Expression | Old result | New result |
> |:-------------------------------|:-----------|:-----------|
> | `JsonVariant(42).is<int>()` | `true` | `true` |
> | `JsonVariant(42).is<float>()` | `false` | `true` |
> | `JsonVariant(42).is<double>()` | `false` | `true` |
v5.9.0
------
* Added `JsonArray::remove(iterator)` (issue #479)
* Added `JsonObject::remove(iterator)`
* Renamed `JsonArray::removeAt(size_t)` into `remove(size_t)`
* Renamed folder `include/` to `src/`
* Fixed warnings `floating constant exceeds range of float`and `floating constant truncated to zero` (issue #483)
* Removed `Print` class and converted `printTo()` to a template method (issue #276)
* Removed example `IndentedPrintExample.ino`
* Now compatible with Particle 0.6.1, thanks to Jacob Nite (issue #294 and PR #461 by @foodbag)
v5.8.4
------
* Added custom implementation of `strtod()` (issue #453)
* Added custom implementation of `strtol()` (issue #465)
* `char` is now treated as an integral type (issue #337, #370)
v5.8.3
------
* Fixed an access violation in `DynamicJsonBuffer` when memory allocation fails (issue #433)
* Added operators `==` and `!=` for two `JsonVariant`s (issue #436)
* Fixed `JsonVariant::operator[const FlashStringHelper*]` (issue #441)
v5.8.2
------
* Fixed parsing of comments (issue #421)
* Fixed ignored `Stream` timeout (issue #422)
* Made sure we don't read more that necessary (issue #422)
* Fixed error when the key of a `JsonObject` is a `char[]` (issue #423)
* Reduced code size when using `const` references
* Fixed error with string of type `unsigned char*` (issue #428)
* Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420)
v5.8.1
------
* Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415)
* Fixed errors with Variable Length Arrays (issue #416)
* Fixed error when both `ARDUINOJSON_ENABLE_STD_STREAM` and `ARDUINOJSON_ENABLE_ARDUINO_STREAM` are set to `1`
* Fixed error "Stream does not name a type" (issue #412)
v5.8.0
------
* Added operator `==` to compare `JsonVariant` and strings (issue #402)
* Added support for `Stream` (issue #300)
* Reduced memory consumption by not duplicating spaces and comments
> ### BREAKING CHANGES :warning:
>
> `JsonBuffer::parseObject()` and `JsonBuffer::parseArray()` have been pulled down to the derived classes `DynamicJsonBuffer` and `StaticJsonBufferBase`.
>
> This means that if you have code like:
>
> ```c++
> void myFunction(JsonBuffer& jsonBuffer);
> ```
>
> you need to replace it with one of the following:
>
> ```c++
> void myFunction(DynamicJsonBuffer& jsonBuffer);
> void myFunction(StaticJsonBufferBase& jsonBuffer);
> template<typename TJsonBuffer> void myFunction(TJsonBuffer& jsonBuffer);
> ```
v5.7.3
------
* Added an `printTo(char[N])` and `prettyPrintTo(char[N])` (issue #292)
* Added ability to set a nested value like this: `root["A"]["B"] = "C"` (issue #352)
* Renamed `*.ipp` to `*Impl.hpp` because they were ignored by Arduino IDE (issue #396)
v5.7.2
------
* Made PROGMEM available on more platforms (issue #381)
* Fixed PROGMEM causing an exception on ESP8266 (issue #383)
v5.7.1
------
* Added support for PROGMEM (issue #76)
* Fixed compilation error when index is not an `int` (issue #381)
v5.7.0
------
* Templatized all functions using `String` or `std::string`
* Removed `ArduinoJson::String`
* Removed `JsonVariant::defaultValue<T>()`
* Removed non-template `JsonObject::get()` and `JsonArray.get()`
* Fixed support for `StringSumHelper` (issue #184)
* Replaced `ARDUINOJSON_USE_ARDUINO_STRING` by `ARDUINOJSON_ENABLE_STD_STRING` and `ARDUINOJSON_ENABLE_ARDUINO_STRING` (issue #378)
* Added example `StringExample.ino` to show where `String` can be used
* Increased default nesting limit to 50 when compiled for a computer (issue #349)
> ### BREAKING CHANGES :warning:
>
> The non-template functions `JsonObject::get()` and `JsonArray.get()` have been removed. This means that you need to explicitely tell the type you expect in return.
>
> Old code:
>
> ```c++
> #define ARDUINOJSON_USE_ARDUINO_STRING 0
> JsonVariant value1 = myObject.get("myKey");
> JsonVariant value2 = myArray.get(0);
> ```
>
> New code:
>
> ```c++
> #define ARDUINOJSON_ENABLE_ARDUINO_STRING 0
> #define ARDUINOJSON_ENABLE_STD_STRING 1
> JsonVariant value1 = myObject.get<JsonVariant>("myKey");
> JsonVariant value2 = myArray.get<JsonVariant>(0);
> ```
v5.6.7
------
* Fixed `array[idx].as<JsonVariant>()` and `object[key].as<JsonVariant>()`
* Fixed return value of `JsonObject::set()` (issue #350)
* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354)
* Fixed parser that incorrectly rejected floats containing a `+` (issue #349)
v5.6.6
------
* Fixed `-Wparentheses` warning introduced in v5.6.5 (PR #335 by @nuket)
* Added `.mbedignore` for ARM mbdeb (PR #334 by @nuket)
* Fixed `JsonVariant::success()` which didn't propagate `JsonArray::success()` nor `JsonObject::success()` (issue #342).
v5.6.5
------
* `as<char*>()` now returns `true` when input is `null` (issue #330)
v5.6.4
------
* Fixed error in float serialization (issue #324)
v5.6.3
------
* Improved speed of float serialization (about twice faster)
* Added `as<JsonArray>()` as a synonym for `as<JsonArray&>()`... (issue #291)
* Fixed `call of overloaded isinf(double&) is ambiguous` (issue #284)
v5.6.2
------
* Fixed build when another lib does `#undef isnan` (issue #284)
v5.6.1
------
* Added missing `#pragma once` (issue #310)
v5.6.0
------
* ArduinoJson is now a header-only library (issue #199)
v5.5.1
------
* Fixed compilation error with Intel Galileo (issue #299)
v5.5.0
------
* Added `JsonVariant::success()` (issue #279)
* Renamed `JsonVariant::invalid<T>()` to `JsonVariant::defaultValue<T>()`
v5.4.0
------
* Changed `::String` to `ArduinoJson::String` (issue #275)
* Changed `::Print` to `ArduinoJson::Print` too
v5.3.0
------
* Added custom implementation of `ftoa` (issues #266, #267, #269 and #270)
* Added `JsonVariant JsonBuffer::parse()` (issue #265)
* Fixed `unsigned long` printed as `signed long` (issue #170)
v5.2.0
------
* Added `JsonVariant::as<char*>()` as a synonym for `JsonVariant::as<const char*>()` (issue #257)
* Added example `JsonHttpClient` (issue #256)
* Added `JsonArray::copyTo()` and `JsonArray::copyFrom()` (issue #254)
* Added `RawJson()` to insert pregenerated JSON portions (issue #259)
v5.1.1
------
* Removed `String` duplication when one replaces a value in a `JsonObject` (PR #232 by @ulion)
v5.1.0
------
* Added support of `long long` (issue #171)
* Moved all build settings to `ArduinoJson/Configuration.hpp`
> ### BREAKING CHANGE :warning:
>
> If you defined `ARDUINOJSON_ENABLE_STD_STREAM`, you now need to define it to `1`.
v5.0.8
------
* Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181)
* Fixed `JsonVariant::is<bool>()` that was incorrectly returning false (issue #214)
v5.0.7
------
* Made library easier to use from a CMake project: simply `add_subdirectory(ArduinoJson/src)`
* Changed `String` to be a `typedef` of `std::string` (issues #142 and #161)
> ### BREAKING CHANGES :warning:
>
> - `JsonVariant(true).as<String>()` now returns `"true"` instead of `"1"`
> - `JsonVariant(false).as<String>()` now returns `"false"` instead of `"0"`
v5.0.6
------
* Added parameter to `DynamicJsonBuffer` constructor to set initial size (issue #152)
* Fixed warning about library category in Arduino 1.6.6 (issue #147)
* Examples: Added a loop to wait for serial port to be ready (issue #156)
v5.0.5
------
* Added overload `JsonObjectSuscript::set(value, decimals)` (issue #143)
* Use `float` instead of `double` to reduce the size of `JsonVariant` (issue #134)
v5.0.4
------
* Fixed ambiguous overload with `JsonArraySubscript` and `JsonObjectSubscript` (issue #122)
v5.0.3
------
* Fixed `printTo(String)` which wrote numbers instead of strings (issue #120)
* Fixed return type of `JsonArray::is<T>()` and some others (issue #121)
v5.0.2
------
* Fixed segmentation fault in `parseObject(String)` and `parseArray(String)`, when the
`StaticJsonBuffer` is too small to hold a copy of the string
* Fixed Clang warning "register specifier is deprecated" (issue #102)
* Fixed GCC warning "declaration shadows a member" (issue #103)
* Fixed memory alignment, which made ESP8266 crash (issue #104)
* Fixed compilation on Visual Studio 2010 and 2012 (issue #107)
v5.0.1
------
* Fixed compilation with Arduino 1.0.6 (issue #99)
v5.0.0
------
* Added support of `String` class (issues #55, #56, #70, #77)
* Added `JsonBuffer::strdup()` to make a copy of a string (issues #10, #57)
* Implicitly call `strdup()` for `String` but not for `char*` (issues #84, #87)
* Added support of non standard JSON input (issue #44)
* Added support of comments in JSON input (issue #88)
* Added implicit cast between numerical types (issues #64, #69, #93)
* Added ability to read number values as string (issue #90)
* Redesigned `JsonVariant` to leverage converting constructors instead of assignment operators (issue #66)
* Switched to new the library layout (requires Arduino 1.0.6 or above)
> ### BREAKING CHANGES :warning:
>
> - `JsonObject::add()` was renamed to `set()`
> - `JsonArray::at()` and `JsonObject::at()` were renamed to `get()`
> - Number of digits of floating point value are now set with `double_with_n_digits()`
**Personal note about the `String` class**:
Support of the `String` class has been added to the library because many people use it in their programs.
However, you should not see this as an invitation to use the `String` class.
The `String` class is **bad** because it uses dynamic memory allocation.
Compared to static allocation, it compiles to a bigger, slower program, and is less predictable.
You certainly don't want that in an embedded environment!
v4.6
----
* Example: changed `char[] json` into `char json[]`. Damn it C# !
* Fixed segmentation fault in `DynamicJsonBuffer` when memory allocation fails (issue #92)
v1.1
v4.5
----
* Example: changed `char* json` into `char[] json` so that the bytes are not write protected
* Fixed parsing bug when the JSON contains multi-dimensional arrays
* Fixed buffer overflow when input contains a backslash followed by a terminator (issue #81)
v1.0
**Upgrading is recommended** since previous versions contain a potential security risk.
Special thanks to [Giancarlo Canales Barreto](https://github.com/gcanalesb) for finding this nasty bug.
v4.4
----
Initial release
* Added `JsonArray::measureLength()` and `JsonObject::measureLength()` (issue #75)
v4.3
----
* Added `JsonArray::removeAt()` to remove an element of an array (issue #58)
* Fixed stack-overflow in `DynamicJsonBuffer` when parsing huge JSON files (issue #65)
* Fixed wrong return value of `parseArray()` and `parseObject()` when allocation fails (issue #68)
v4.2
----
* Switched back to old library layout (issues #39, #43 and #45)
* Removed global new operator overload (issue #40, #45 and #46)
* Added an example with EthernetServer
v4.1
----
* Added DynamicJsonBuffer (issue #19)
v4.0
----
* Unified parser and generator API (issue #23)
* Updated library layout, now requires Arduino 1.0.6 or newer
> ### BREAKING CHANGES :warning:
>
> API changed significantly since v3, see [Migrating code to the new API](https://arduinojson.org/doc/migration/).

16
CMakeLists.txt Normal file
View File

@ -0,0 +1,16 @@
# ArduinoJson - arduinojson.org
# Copyright Benoit Blanchon 2014-2018
# MIT License
cmake_minimum_required(VERSION 3.0)
project(ArduinoJson)
enable_testing()
if(${COVERAGE})
set(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
endif()
include_directories(${CMAKE_CURRENT_LIST_DIR}/src)
add_subdirectory(third-party/catch)
add_subdirectory(test)

11
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,11 @@
# Contribution to ArduinoJson
First, thank you for taking the time to contribute to this project.
You can submit changes via GitHub Pull Requests.
Please:
1. Unit test every change in behavior
2. Use clang-format in "file" mode to format the code
3. Consider using the Continuous Integration (Travis and AppVeyor)

View File

@ -1,67 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014 - MIT License
*/
#include "JsonArray.h"
#include "JsonHashTable.h"
JsonArray::JsonArray(char* json, jsmntok_t* tokens)
: JsonObjectBase(json, tokens)
{
if (tokens == 0 || tokens[0].type != JSMN_ARRAY)
makeInvalid();
}
/*
* Returns the token for the value at the specified index
*/
jsmntok_t* JsonArray::getToken(int index)
{
// sanity check
if (json == 0 || tokens == 0 || index < 0 || index >= tokens[0].size)
return 0;
// skip first token, it's the whole object
jsmntok_t* currentToken = tokens + 1;
// skip all tokens before the specified index
for (int i = 0; i < index; i++)
{
// move forward: current + nested tokens
currentToken += 1 + getNestedTokenCount(currentToken);
}
return currentToken;
}
JsonArray JsonArray::getArray(int index)
{
return JsonArray(json, getToken(index));
}
bool JsonArray::getBool(int index)
{
return getBoolFromToken(getToken(index));
}
double JsonArray::getDouble(int index)
{
return getDoubleFromToken(getToken(index));
}
JsonHashTable JsonArray::getHashTable(int index)
{
return JsonHashTable(json, getToken(index));
}
long JsonArray::getLong(int index)
{
return getLongFromToken(getToken(index));
}
char* JsonArray::getString(int index)
{
return getStringFromToken(getToken(index));
}

View File

@ -1,42 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014 - MIT License
*/
#ifndef __JSONARRAY_H
#define __JSONARRAY_H
#include "JsonObjectBase.h"
class JsonHashTable;
class JsonArray : public JsonObjectBase
{
template <int N>
friend class JsonParser;
friend class JsonHashTable;
public:
JsonArray() {}
int getLength()
{
return tokens != 0 ? tokens[0].size : 0;
}
JsonArray getArray(int index);
bool getBool(int index);
double getDouble(int index);
JsonHashTable getHashTable(int index);
long getLong(int index);
char* getString(int index);
private:
JsonArray(char* json, jsmntok_t* tokens);
jsmntok_t* getToken(int index);
};
#endif

View File

@ -1,84 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014 - MIT License
*/
#include "JsonArray.h"
#include "JsonHashTable.h"
#include <string.h> // for strcmp()
JsonHashTable::JsonHashTable(char* json, jsmntok_t* tokens)
: JsonObjectBase(json, tokens)
{
if (tokens == 0 || tokens[0].type != JSMN_OBJECT)
makeInvalid();
}
/*
* Returns the token for the value associated with the specified key
*/
jsmntok_t* JsonHashTable::getToken(const char* desiredKey)
{
// sanity check
if (json == 0 || tokens == 0 || desiredKey == 0)
return 0;
// skip first token, it's the whole object
jsmntok_t* currentToken = tokens + 1;
// scan each keys
for (int i = 0; i < tokens[0].size / 2 ; i++)
{
// get key token string
char* key = getStringFromToken(currentToken);
// compare with desired name
if (strcmp(desiredKey, key) == 0)
{
// return the value token that follows the key token
return currentToken + 1;
}
// move forward: key + value + nested tokens
currentToken += 2 + getNestedTokenCount(currentToken + 1);
}
// nothing found, return NULL
return 0;
}
bool JsonHashTable::containsKey(const char* key)
{
return getToken(key) != 0;
}
JsonArray JsonHashTable::getArray(const char* key)
{
return JsonArray(json, getToken(key));
}
bool JsonHashTable::getBool(const char* key)
{
return getBoolFromToken(getToken(key));
}
double JsonHashTable::getDouble(const char* key)
{
return getDoubleFromToken(getToken(key));
}
JsonHashTable JsonHashTable::getHashTable(const char* key)
{
return JsonHashTable(json, getToken(key));
}
long JsonHashTable::getLong(const char* key)
{
return getLongFromToken(getToken(key));
}
char* JsonHashTable::getString(const char* key)
{
return getStringFromToken(getToken(key));
}

View File

@ -1,39 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014 - MIT License
*/
#ifndef __JSONHASHTABLE_H
#define __JSONHASHTABLE_H
#include "JsonObjectBase.h"
class JsonArray;
class JsonHashTable : public JsonObjectBase
{
template <int N>
friend class JsonParser;
friend class JsonArray;
public:
JsonHashTable() {}
bool containsKey(const char* key);
JsonArray getArray(const char* key);
bool getBool(const char* key);
double getDouble(const char* key);
JsonHashTable getHashTable(const char* key);
long getLong(const char* key);
char* getString(const char* key);
private:
JsonHashTable(char* json, jsmntok_t* tokens);
jsmntok_t* getToken(const char* key);
};
#endif

View File

@ -1,67 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014
* MIT License
*/
#include "JsonObjectBase.h"
#include <stdlib.h> // for strtol, strtod
int JsonObjectBase::getNestedTokenCount(jsmntok_t* token)
{
int end = token->end;
int count = 0;
token++;
while (token->start < end)
{
token++;
count++;
}
return count;
}
bool JsonObjectBase::getBoolFromToken(jsmntok_t* token)
{
if (token->type != JSMN_PRIMITIVE) return 0;
// "true"
if (json[token->start] == 't') return true;
// "false"
if (json[token->start] == 'f') return false;
// "null"
if (json[token->start] == 'n') return false;
// number
return strtol(json + token->start, 0, 0) != 0;
}
double JsonObjectBase::getDoubleFromToken(jsmntok_t* token)
{
if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
return strtod(json + token->start, 0);
}
long JsonObjectBase::getLongFromToken(jsmntok_t* token)
{
if (token == 0 || token->type != JSMN_PRIMITIVE) return 0;
return strtol(json + token->start, 0, 0);
}
char* JsonObjectBase::getStringFromToken(jsmntok_t* token)
{
if (token == 0 || token->type != JSMN_PRIMITIVE && token->type != JSMN_STRING)
return 0;
// add null terminator to the string
json[token->end] = 0;
return json + token->start;
}

View File

@ -1,52 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014
* MIT License
*/
#ifndef __JSONOBJECTBASE_H
#define __JSONOBJECTBASE_H
#include "utility/jsmn.h"
class JsonObjectBase
{
public:
JsonObjectBase()
{
makeInvalid();
}
bool success()
{
return json != 0 && tokens != 0;
}
protected:
JsonObjectBase(char* json, jsmntok_t* tokens)
{
this->json = json;
this->tokens = tokens;
}
void makeInvalid()
{
json = 0;
tokens = 0;
}
static int getNestedTokenCount(jsmntok_t* token);
bool getBoolFromToken(jsmntok_t* token);
double getDoubleFromToken(jsmntok_t* token);
long getLongFromToken(jsmntok_t* token);
char* getStringFromToken(jsmntok_t* token);
char* json;
jsmntok_t* tokens;
};
#endif

View File

@ -1,69 +0,0 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014 - MIT License
*/
#ifndef __JSONPARSER_H
#define __JSONPARSER_H
#include "JsonHashTable.h"
#include "JsonArray.h"
/*
* The JSON parser.
*
* You need to specifiy the number of token to be allocated for that parser.
* Values from 16 to 32 are recommended.
* The parser size will be MAX_TOKEN*8 bytes.
* Don't forget that the memory size of standard Arduino board is only 2KB
*
* CAUTION: JsonArray and JsonHashTable contain pointers to tokens of the
* JsonParser, so they need the JsonParser to be in memory to work.
* As a result, you must not create JsonArray and JsonHashTable that have a
* longer life that the JsonParser.
*/
template <int MAX_TOKENS>
class JsonParser
{
public:
/*
* Parse the JSON string and return a array.
*
* The content of the string may be altered to add '\0' at the
* end of string tokens
*/
JsonArray parseArray(char* json)
{
return JsonArray(json, parse(json));
}
/*
* Parse the JSON string and return a array.
*
* The content of the string may be altered to add '\0' at the
* end of string tokens
*/
JsonHashTable parseHashTable(char* json)
{
return JsonHashTable(json, parse(json));
}
private:
jsmntok_t* parse(char* json)
{
jsmn_parser parser;
jsmn_init(&parser);
if (JSMN_SUCCESS != jsmn_parse(&parser, json, tokens, MAX_TOKENS))
return 0;
return tokens;
}
jsmntok_t tokens[MAX_TOKENS];
};
#endif

10
LICENSE.md Normal file
View File

@ -0,0 +1,10 @@
The MIT License (MIT)
---------------------
Copyright © 2014-2018 Benoit BLANCHON
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

464
README.md
View File

@ -1,416 +1,110 @@
An efficient JSON parser for Arduino
====================================
![ArduinoJson](banner.svg)
This library is an thin C++ wrapper around the *jsmn* tokenizer: http://zserge.com/jsmn.html
---
It's design to be very lightweight, works without any allocation on the heap (no malloc) and supports nested objects.
[![Build status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/master?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/master) [![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=master)](https://travis-ci.org/bblanchon/ArduinoJson) [![Coverage Status](https://img.shields.io/coveralls/bblanchon/ArduinoJson.svg)](https://coveralls.io/r/bblanchon/ArduinoJson?branch=master) [![Star this project](http://githubbadges.com/star.svg?user=bblanchon&repo=ArduinoJson&style=flat&color=fff&background=007ec6)](https://github.com/bblanchon/ArduinoJson)
It has been written with Arduino in mind, but it isn't linked to Arduino libraries so you can use this library on any other C++ project.
ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).
## Features
Features
--------
* JSON decoding (comments are supported)
* JSON encoding (with optional indentation)
* Elegant API, easy to use
* Fixed memory allocation (zero malloc)
* No data duplication (zero copy)
* Portable (written in C++98, can be used in any C++ project)
* Self-contained (no external dependency)
* Small footprint
* Input and output streams
* [100% code coverage](https://coveralls.io/github/bblanchon/ArduinoJson)
* [Header-only library](https://en.wikipedia.org/wiki/Header-only)
* [MIT License](https://en.wikipedia.org/wiki/MIT_License)
* [Comprehensive documentation](https://arduinojson.org?utm_source=github&utm_medium=readme)
* Based on the well-proven [jsmn](http://zserge.com/jsmn.html) tokenizer
* Supports nested objects
* Works with fixed memory allocation : no `malloc()`
* Low footprint
* MIT License
## Compatibility
ArduinoJson works on the following hardware:
Example
-------
* <img src="https://www.arduino.cc/favicon.ico" height="16" width="16"> Arduino boards: [Uno](https://www.arduino.cc/en/Main/ArduinoBoardUno), [Due](https://www.arduino.cc/en/Main/ArduinoBoardDue), [Mini](https://www.arduino.cc/en/Main/ArduinoBoardMini), [Micro](https://www.arduino.cc/en/Main/ArduinoBoardMicro), [Yun](https://www.arduino.cc/en/Main/ArduinoBoardYun)...
* <img src="http://espressif.com/sites/all/themes/espressif/favicon.ico" height="16" width="16"> Espressif chips: [ESP8266](https://en.wikipedia.org/wiki/ESP8266), [ESP32](https://en.wikipedia.org/wiki/ESP32)
* <img src="https://www.wemos.cc/themes/martin-materialize-parallax/assets/favicon.ico" height="16" width="16"> WeMos boards: [D1](https://wiki.wemos.cc/products:d1:d1), [D1 mini](https://wiki.wemos.cc/products:d1:d1_mini), ...
* <img src="http://redbearlab.com/favicon.ico" height="16" width="16"> RedBearLab boards: [BLE Nano](http://redbearlab.com/blenano/), [BLE Mini](http://redbearlab.com/blemini/), [WiFi Micro](https://redbear.cc/product/wifi/wifi-micro.html), [LOLIN32](https://wiki.wemos.cc/products:lolin32:lolin32)...
* <img src="https://www.pjrc.com/favicon.ico" height="16" width="16"> [Teensy](https://www.pjrc.com/teensy/) boards
* <img src="https://software.intel.com/sites/all/themes/zero/favicon.ico" height="16" width="16"> Intel boards: Edison, Galileo...
* <img src="https://www-assets.particle.io/images/favicon.png" height="16" width="16"> Particle boards: [Photon](https://www.particle.io/products/hardware/photon-wifi-dev-kit), [Electron](https://www.particle.io/products/hardware/electron-cellular-dev-kit)...
* <img src="http://www.ti.com/favicon.ico" height="16" width="16"> Texas Instruments boards: [MSP430](http://www.ti.com/microcontrollers/msp430-ultra-low-power-mcus/overview/overview.html)...
char json[] = "{\"Name\":\"Blanchon\",\"Skills\":[\"C\",\"C++\",\"C#\"],\"Age\":32,\"Online\":true}";
ArduinoJson compiles with zero warning on the following compilers, IDEs, and platforms:
JsonParser<32> parser;
* <img src="https://www.arduino.cc/favicon.ico" height="16" width="16"> [Arduino IDE](https://www.arduino.cc/en/Main/Software)
* <img src="http://cdn.platformio.org/favicon.ico" height="16" width="16"> [PlatformIO](http://platformio.org/)
* <img src="http://energia.nu/img/favicon.ico" height="16" width="16"> [Energia](http://energia.nu/)
* <img src="http://www.visualmicro.com/pics/arduino-visual-studio-ld.png" height="16" width="16"> [Visual Micro](http://www.visualmicro.com/)
* <img src="http://www.atmel.com/Images/favicon.ico" height="16" width="16"> [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/)
* <img src="https://www.iar.com/favicon.ico" height="16" width="16"> [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/)
* <img src="http://www.st.com/etc/clientlibs/st-site/media/app/images/favicon.png" height="16" width="16"> [Atollic TrueSTUDIO](https://atollic.com/truestudio/)
* <img src="http://www.keil.com/favicon.ico" height="16" width="16"> [Keil uVision](http://www.keil.com/)
* <img src="http://www.microchip.com/favicon.ico" height="16" width="16"> [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide)
* <img src="https://gcc.gnu.org/favicon.ico" height="16" width="16"> [GCC](https://gcc.gnu.org/)
* <img src="https://clang.llvm.org/favicon.ico" height="16" width="16"> [Clang](https://clang.llvm.org/)
* <img src="https://www.visualstudio.com/favicon.ico" height="16" width="16"> [Visual Studio](https://www.visualstudio.com/)
JsonHashTable hashTable = parser.parseHashTable(json);
## Quickstart
if (!hashTable.success())
{
return;
}
### Deserialization
char* name = hashTable.getString("Name");
Here is a program that parses a JSON document with ArduinoJson.
JsonArray skills = hashTable.getArray("Skills");
```c++
char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
int age = hashTable.getLong("Age");
StaticJsonBuffer<200> jsonBuffer;
bool online = hashTable.getBool("Online");
JsonObject& root = jsonBuffer.parseObject(json);
const char* sensor = root["sensor"];
long time = root["time"];
double latitude = root["data"][0];
double longitude = root["data"][1];
```
See the [tutorial on arduinojson.org](https://arduinojson.org/doc/decoding/?utm_source=github&utm_medium=readme)
How to use ?
-------------
### Serialization
### 1. Install the library
Here is a program that generates a JSON document with ArduinoJson:
Download the library and extract it to:
```c++
StaticJsonBuffer<200> jsonBuffer;
<your Arduino Sketch folder>/libraries/ArduinoJsonParser
JsonObject& root = jsonBuffer.createObject();
root["sensor"] = "gps";
root["time"] = 1351824120;
### 2. Import in your sketch
JsonArray& data = root.createNestedArray("data");
data.add(48.756080);
data.add(2.302038);
Just add the following line on the top of your `.ino` file:
root.printTo(Serial);
// This prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
```
#include <JsonParser.h>
### 3. Create a parser
See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme)
To extract data from the JSON string, you need to create a `JsonParser`, and specify the number of token you allocate for the parser itself:
## Documentation
JsonParser<32> parser;
> #### How to choose the number of tokens ?
The documentation is available on [arduinojson.org](https://arduinojson.org/?utm_source=github&utm_medium=readme), here are some shortcuts:
> A token is an element of the JSON object: either a key, a value, an hash-table or an array.
> As an example the `char json[]` on the top of this page contains 12 tokens (don't forget to count 1 for the whole object and 1 more for the array itself).
* The [Examples](https://arduinojson.org/example/?utm_source=github&utm_medium=readme) show how to use the library in various situations.
* The [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=readme) contains the description of each class and function.
* The [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=readme) has the answer to virtually every question.
* The [ArduinoJson Assistant](https://arduinojson.org/assistant/?utm_source=github&utm_medium=readme) writes programs for you!
> The more tokens you allocate, the more complex the JSON can be, but also the more memory is occupied.
> Each token takes 8 bytes, so `sizeof(JsonParser<32>)` is 256 bytes which is quite big in an Arduino with only 2KB of RAM.
> Don't forget that you also have to store the JSON string in RAM and it's probably big.
---
> 32 tokens may seem small, but it's very decent for an 8-bit processor, you wouldn't get better results with other JSON libraries.
Do you like this library? Please [star this project on GitHub](https://github.com/bblanchon/ArduinoJson/stargazers)!
### 4. Extract data
To use this library, you need to know beforehand what is the type of data contained in the JSON string, which is very likely.
The root object has to be either a hash-table (like `{"key":"value"}`) or an array (like `[1,2]`).
The nested objects can be either arrays, booleans, hash-tables, numbers or strings.
If you need other type, you can get the string value and parse it yourself.
#### Hash-table
Consider we have a `char json[]` containing to the following JSON string:
{
"Name":"Blanchon",
"Skills":[
"C",
"C++",
"C#"],
"Age":32,
"Online":true
}
In this case the root object of the JSON string is a hash-table, so you need to extract a `JsonHashTable`:
JsonHashTable root = parser.parseHashTable(json);
To check if the parsing was successful, you must check:
if (!root.success())
{
// Parsing fail: could be an invalid JSON, or too many tokens
}
And then extract the member you need:
char* name = hashTable.getString("Name");
JsonArray skills = hashTable.getArray("Skills");
int age = hashTable.getLong("Age");
bool online = hashTable.getBool("Online");
#### Array
Consider we have a `char json[]` containing to the following JSON string:
[
[ 1.2, 3.4 ],
[ 5.6, 7.8 ]
]
In this case the root object of the JSON string is an array, so you need to extract a `JsonArray`:
JsonArray root = parser.parseArray(json);
To check if the parsing was successful, you must check:
if (!root.success())
{
// Parsing fail: could be an invalid JSON, or too many tokens
}
And then extract the content by its index in the array:
JsonArray row0 = root.getArray(0);
double a = row0.getDouble(0);
or simply:
double a = root.getArray(0).getDouble(0);
Common pitfalls
---------------
### 1. Not enough tokens
By design, the library has no way to tell you why `JsonParser::parseArray()` or `JsonParser::parseHashTable()` failed.
There are basically two reasons why they may fail:
1. the JSON string is invalid
2. the JSON string contains more tokens that the parser can store
So, if you are sure the JSON string is correct and you still can't parse it, you should slightly increase the number of token of the parser.
### 2. Not enough memory
You may go into unpredictable trouble if you allocate more memory than your processor really has.
It's a very common issue in embedded development.
To diagnose this, look at every big objects in you code and sum their size to check that they fit in RAM.
For example, don't do this:
char json[1024]; // 1 KB
JsonParser<64> parser; // 512 B
because it may be too big for a processor with only 2 KB: you need free memory to store other variables and the call stack.
That is why an 8-bit processor is not able to parse long and complex JSON strings.
### 3. JsonParser not in memory
To reduce the memory consumption, `JsonArray` and `JsonHashTable` contains pointer to the token that are inside the `JsonParser`. This can only work if the `JsonParser` is still in memory.
For example, don't do this:
JsonArray getArray(char* json)
{
JsonParser<16> parser;
return parser.parseArray(parser);
}
because the local variable `parser` will be *removed* from memory when the function `getArray()` returns, and the pointer inside `JsonArray` will point to an invalid location.
### 4. JSON string is altered
This will probably never be an issue, but you need to be aware of this feature.
When you pass a `char[]` to `JsonParser::parseArray()` or `JsonParser::parseHashTable()`, the content of the string will be altered to add `\0` at the end of the tokens.
This is because we want functions like `JsonArray::getString()` to return a null-terminating string without any memory allocation.
Memory usage
------------
Here are the size of the main classes of the library.
This table is for an 8-bit Arduino, types would be bigger on a 32-bit processor.
<table>
<tr>
<th>Type</th>
<th>Size in bytes</th>
</tr>
<tr>
<td>Parser&lt;N&gt;</td>
<td>8 x N</td>
</tr>
<tr>
<td>JsonArray</td>
<td>4</td>
</tr>
<tr>
<td>JsonHashTable</td>
<td>4</td>
</tr>
</table>
Code size
---------
Theses tables has been created by analyzing the map file generated by AVR-GCC after adding `-Wl,-Map,foo.map` to the command line.
As you'll see the code size if between 1680 and 3528 bytes, depending on the features you use.
### Minimum setup
<table>
<tr>
<th>Function</th>
<th>Size in bytes</th>
</tr>
<tr>
<td>strcmp(char*,char*)</td>
<td>18</td>
</tr>
<tr>
<td>jsmn_init(jsmn_parser*)</td>
<td>20</td>
</tr>
<tr>
<td>jsmn_parse(jsmn_parser*, char const*, jsmntok_t*, unsigned int)</td>
<td>960</td>
</tr>
<tr>
<td>JsonParser::parse(char*)</td>
<td>106</td>
</tr>
<tr>
<td>JsonObjectBase::getNestedTokenCount(jsmntok_t*)</td>
<td>84</td>
</tr>
<tr>
<td>JsonObjectBase::getStringFromToken(jsmntok_t*)</td>
<td>68</td>
</tr>
<tr>
<td>JsonArray::JsonArray(char*, jsmntok_t*)</td>
<td>42</td>
</tr>
<tr>
<td>JsonArray::getToken(int)</td>
<td>112</td>
</tr>
<tr>
<td>JsonArray::getString(int)</td>
<td>18</td>
</tr>
<tr>
<td>JsonHashTable::JsonHashTable(char*, jsmntok_t*)</td>
<td>42</td>
</tr>
<tr>
<td>JsonHashTable::getToken(char*)</td>
<td>180</td>
</tr>
<tr>
<td>JsonHashTable::getString(char*)</td>
<td>18</td>
</tr>
<tr>
<td>TOTAL</td>
<td>1680</td>
</tr>
</table>
### Additional space to parse nested objects
<table>
<tr>
<th>Function</th>
<th>Size in bytes</th>
</tr>
<tr>
<td>JsonArray::getArray(int)</td>
<td>42</td>
</tr>
<tr>
<td>JsonArray::getHashTable(int)</td>
<td>64</td>
</tr>
<tr>
<td>JsonHashTable::getArray(char*)</td>
<td>64</td>
</tr>
<tr>
<td>JsonHashTable::getHashTable(char*)</td>
<td>42</td>
</tr>
<tr>
<td>TOTAL</td>
<td>212</td>
</tr>
</table>
### Additional space to parse `bool` values
<table>
<tr>
<th>Function</th>
<th>Size in bytes</th>
</tr>
<tr>
<td>JsonObjectBase::getBoolFromToken(jsmntok_t*)</td>
<td>82</td>
</tr>
<tr>
<td>JsonArray::getBool(int)</td>
<td>18</td>
</tr>
<tr>
<td>JsonHashTable::getBool(char*)</td>
<td>18</td>
</tr>
<tr>
<td>TOTAL</td>
<td>130</td>
</tr>
</table>
### Additional space to parse `double` values
<table>
<tr>
<th>Function</th>
<th>Size in bytes</th>
</tr>
<tr>
<td>strtod(char*,int)</td>
<td>704</td>
</tr>
<tr>
<td>JsonObjectBase::getDoubleFromToken(jsmntok_t*)</td>
<td>44</td>
</tr>
<tr>
<td>JsonArray::getDouble(int)</td>
<td>18</td>
</tr>
<tr>
<td>JsonHashTable::getDouble(char*)</td>
<td>18</td>
</tr>
<tr>
<td>TOTAL</td>
<td>796</td>
</tr>
</table>
### Additional space to parse `long` values
<table>
<tr>
<th>Function</th>
<th>Size in bytes</th>
</tr>
<tr>
<td>strtol(char*,char**,int)</td>
<td>606</td>
</tr>
<tr>
<td>JsonObjectBase::getLongFromToken(jsmntok_t*)</td>
<td>56</td>
</tr>
<tr>
<td>JsonArray::getLong(int)</td>
<td>18</td>
</tr>
<tr>
<td>JsonHashTable::getLong(char*)</td>
<td>18</td>
</tr>
<tr>
<td>TOTAL</td>
<td>710</td>
</tr>
</table>
Links
-----
* [The project for which I made me this library](http://blog.benoitblanchon.fr/rfid-payment-terminal/)
* [Blog post on the motivation for this library](http://blog.benoitblanchon.fr/arduino-json-parser/)
What? You don't like it but you *love* it?
We don't take donations anymore, but [we sell a book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme), so you can help and learn at the same time!

27
SUPPORT.md Normal file
View File

@ -0,0 +1,27 @@
# ArduinoJson Support
First off, thank you very much for using ArduinoJson.
We'll be very happy to help you, but first please read the following.
## Before asking for help
1. Read the [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=support)
2. Search in the [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=support)
If you did not find the answer, please create a [new issue on GitHub](https://github.com/bblanchon/ArduinoJson/issues/new).
It is OK to add a comment to a currently opened issue, but please avoid adding comments to a closed issue.
## Before hitting the Submit button
Please provide all the relevant information:
* Good title
* Short description of the problem
* Target platform
* Compiler model and version
* [MVCE](https://stackoverflow.com/help/mcve)
* Compiler output
Good questions get fast answers!

20
appveyor.yml Normal file
View File

@ -0,0 +1,20 @@
version: 5.13.0.{build}
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
CMAKE_GENERATOR: Visual Studio 15 2017
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
CMAKE_GENERATOR: Visual Studio 14 2015
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
CMAKE_GENERATOR: Visual Studio 12 2013
- CMAKE_GENERATOR: Visual Studio 11 2012
- CMAKE_GENERATOR: Visual Studio 10 2010
- CMAKE_GENERATOR: MinGW Makefiles
configuration: Debug
before_build:
- set PATH=C:\MinGW\bin;%PATH:C:\Program Files\Git\usr\bin;=% # Workaround for CMake not wanting sh.exe on PATH for MinGW
- cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -G "%CMAKE_GENERATOR%" .
build_script:
- cmake --build . --config %CONFIGURATION%
test_script:
- ctest --output-on-failure .

367
banner.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,144 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows how to store your project configuration in a file.
// It uses the SD library but can be easily modified for any other file-system.
//
// The file contains a JSON document with the following content:
// {
// "hostname": "examples.com",
// "port": 2731
// }
#include <ArduinoJson.h>
#include <SD.h>
#include <SPI.h>
// Configuration that we'll store on disk
struct Config {
char hostname[64];
int port;
};
const char *filename = "/config.txt"; // <- SD library uses 8.3 filenames
Config config; // <- global configuration object
// Loads the configuration from a file
void loadConfiguration(const char *filename, Config &config) {
// Open file for reading
File file = SD.open(filename);
// Allocate the memory pool on the stack.
// Don't forget to change the capacity to match your JSON document.
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonBuffer<512> jsonBuffer;
// Parse the root object
JsonObject &root = jsonBuffer.parseObject(file);
if (!root.success())
Serial.println(F("Failed to read file, using default configuration"));
// Copy values from the JsonObject to the Config
config.port = root["port"] | 2731;
strlcpy(config.hostname, // <- destination
root["hostname"] | "example.com", // <- source
sizeof(config.hostname)); // <- destination's capacity
// Close the file (File's destructor doesn't close the file)
file.close();
}
// Saves the configuration to a file
void saveConfiguration(const char *filename, const Config &config) {
// Delete existing file, otherwise the configuration is appended to the file
SD.remove(filename);
// Open file for writing
File file = SD.open(filename, FILE_WRITE);
if (!file) {
Serial.println(F("Failed to create file"));
return;
}
// Allocate the memory pool on the stack
// Don't forget to change the capacity to match your JSON document.
// Use https://arduinojson.org/assistant/ to compute the capacity.
StaticJsonBuffer<256> jsonBuffer;
// Parse the root object
JsonObject &root = jsonBuffer.createObject();
// Set the values
root["hostname"] = config.hostname;
root["port"] = config.port;
// Serialize JSON to file
if (root.printTo(file) == 0) {
Serial.println(F("Failed to write to file"));
}
// Close the file (File's destructor doesn't close the file)
file.close();
}
// Prints the content of a file to the Serial
void printFile(const char *filename) {
// Open file for reading
File file = SD.open(filename);
if (!file) {
Serial.println(F("Failed to read file"));
return;
}
// Extract each characters by one by one
while (file.available()) {
Serial.print((char)file.read());
}
Serial.println();
// Close the file (File's destructor doesn't close the file)
file.close();
}
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
// Initialize SD library
while (!SD.begin()) {
Serial.println(F("Failed to initialize SD library"));
delay(1000);
}
// Should load default config if run for the first time
Serial.println(F("Loading configuration..."));
loadConfiguration(filename, config);
// Create configuration file
Serial.println(F("Saving configuration..."));
saveConfiguration(filename, config);
// Dump config file
Serial.println(F("Print config file..."));
printFile(filename);
}
void loop() {
// not used in this example
}
// See also
// --------
//
// 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/

View File

@ -0,0 +1,81 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.
#include <ArduinoJson.h>
void setup() {
// Initialize Serial port
Serial.begin(9600);
while (!Serial) continue;
// Memory pool for JSON object tree.
//
// Inside the brackets, 200 is the size of the pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonBuffer<200> jsonBuffer;
// StaticJsonBuffer allocates memory on the stack, it can be
// replaced by DynamicJsonBuffer which allocates in the heap.
//
// DynamicJsonBuffer jsonBuffer(200);
// Create the root of the object tree.
//
// It's a reference to the JsonObject, the actual bytes are inside the
// JsonBuffer with all the other nodes of the object tree.
// Memory is freed when jsonBuffer goes out of scope.
JsonObject& root = jsonBuffer.createObject();
// Add values in the object
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do root.set<long>("time", 1351824120);
root["sensor"] = "gps";
root["time"] = 1351824120;
// Add a nested array.
//
// It's also possible to create the array separately and add it to the
// JsonObject but it's less efficient.
JsonArray& data = root.createNestedArray("data");
data.add(48.756080);
data.add(2.302038);
root.printTo(Serial);
// This prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
Serial.println();
root.prettyPrintTo(Serial);
// This prints:
// {
// "sensor": "gps",
// "time": 1351824120,
// "data": [
// 48.756080,
// 2.302038
// ]
// }
}
void loop() {
// not used in this example
}
// See also
// --------
//
// 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/

View File

@ -0,0 +1,112 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows how to parse a JSON document in an HTTP response.
// It uses the Ethernet library, but can be easily adapted for Wifi.
//
// It performs a GET resquest on arduinojson.org/example.json
// Here is the expected response:
// {
// "sensor": "gps",
// "time": 1351824120,
// "data": [
// 48.756080,
// 2.302038
// ]
// }
#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>
void setup() {
// Initialize Serial port
Serial.begin(9600);
while (!Serial) continue;
// Initialize Ethernet library
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
if (!Ethernet.begin(mac)) {
Serial.println(F("Failed to configure Ethernet"));
return;
}
delay(1000);
Serial.println(F("Connecting..."));
// Connect to HTTP server
EthernetClient client;
client.setTimeout(10000);
if (!client.connect("arduinojson.org", 80)) {
Serial.println(F("Connection failed"));
return;
}
Serial.println(F("Connected!"));
// Send HTTP request
client.println(F("GET /example.json HTTP/1.0"));
client.println(F("Host: arduinojson.org"));
client.println(F("Connection: close"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
return;
}
// Check HTTP status
char status[32] = {0};
client.readBytesUntil('\r', status, sizeof(status));
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status);
return;
}
// Skip HTTP headers
char endOfHeaders[] = "\r\n\r\n";
if (!client.find(endOfHeaders)) {
Serial.println(F("Invalid response"));
return;
}
// Allocate JsonBuffer
// Use arduinojson.org/assistant to compute the capacity.
const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60;
DynamicJsonBuffer jsonBuffer(capacity);
// Parse JSON object
JsonObject& root = jsonBuffer.parseObject(client);
if (!root.success()) {
Serial.println(F("Parsing failed!"));
return;
}
// Extract values
Serial.println(F("Response:"));
Serial.println(root["sensor"].as<char*>());
Serial.println(root["time"].as<char*>());
Serial.println(root["data"][0].as<char*>());
Serial.println(root["data"][1].as<char*>());
// Disconnect
client.stop();
}
void loop() {
// not used in this example
}
// See also
// --------
//
// 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/

View File

@ -1,94 +1,78 @@
/*
* malloc-free JSON parser for Arduino
* Benoit Blanchon 2014 - MIT License
*/
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows how to deserialize a JSON document with ArduinoJson.
#include <JsonParser.h>
#include <ArduinoJson.h>
void ParseAnObject()
{
char json[] = "{\"Name\":\"Blanchon\",\"Skills\":[\"C\",\"C++\",\"C#\"],\"Age\":32,\"Online\":true}";
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
JsonParser<32> parser;
// Memory pool for JSON object tree.
//
// Inside the brackets, 200 is the size of the pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonBuffer<200> jsonBuffer;
Serial.print("Parse ");
Serial.println(json);
// StaticJsonBuffer allocates memory on the stack, it can be
// replaced by DynamicJsonBuffer which allocates in the heap.
//
// DynamicJsonBuffer jsonBuffer(200);
JsonHashTable hashTable = parser.parseHashTable(json);
// JSON input string.
//
// It's better to use a char[] as shown here.
// If you use a const char* or a String, ArduinoJson will
// have to make a copy of the input in the JsonBuffer.
char json[] =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
if (!hashTable.success())
{
Serial.println("JsonParser.parseHashTable() failed");
return;
}
// Root of the object tree.
//
// It's a reference to the JsonObject, the actual bytes are inside the
// JsonBuffer with all the other nodes of the object tree.
// Memory is freed when jsonBuffer goes out of scope.
JsonObject& root = jsonBuffer.parseObject(json);
char* name = hashTable.getString("Name");
Serial.print("name=");
Serial.println(name);
// Test if parsing succeeds.
if (!root.success()) {
Serial.println("parseObject() failed");
return;
}
JsonArray skills = hashTable.getArray("Skills");
Serial.println("skills:");
for (int i = 0; i < skills.getLength(); i++)
{
char* value = skills.getString(i);
Serial.print(i);
Serial.print(" ");
Serial.println(value);
}
// Fetch values.
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do root["time"].as<long>();
const char* sensor = root["sensor"];
long time = root["time"];
double latitude = root["data"][0];
double longitude = root["data"][1];
int age = hashTable.getLong("Age");
Serial.print("age=");
Serial.println(age);
bool online = hashTable.getBool("Online");
Serial.print("online=");
Serial.println(online);
// Print values.
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
void ParseAnArray()
{
char json[] = "[[1.2,3.4],[5.6,7.8]]";
JsonParser<32> parser;
Serial.print("Parse ");
Serial.println(json);
JsonArray array = parser.parseArray(json);
if (!array.success())
{
Serial.println("JsonParser.parseArray() failed");
return;
}
for (int i = 0; i < array.getLength(); i++)
{
Serial.println(i);
JsonArray innerArray = array.getArray(i);
for (int j = 0; j < innerArray.getLength(); j++)
{
double value = innerArray.getDouble(j);
Serial.print(" ");
Serial.print(j);
Serial.print("=");
Serial.println(value);
}
}
void loop() {
// not used in this example
}
void setup()
{
Serial.begin(9600);
ParseAnObject();
ParseAnArray();
}
void loop()
{
}
// See also
// --------
//
// 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/

View File

@ -0,0 +1,109 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows how to implement an HTTP server that sends JSON document
// in the responses.
// It uses the Ethernet library but can be easily adapted for Wifi.
//
// It sends the value of the analog and digital pins.
// The JSON document looks like the following:
// {
// "analog": [ 0, 1, 2, 3, 4, 5 ],
// "digital": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
// }
#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetServer server(80);
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
// Initialize Ethernet libary
if (!Ethernet.begin(mac)) {
Serial.println(F("Failed to initialize Ethernet library"));
return;
}
// Start to listen
server.begin();
Serial.println(F("Server is ready."));
Serial.print(F("Please connect to http://"));
Serial.println(Ethernet.localIP());
}
void loop() {
// Wait for an incomming connection
EthernetClient client = server.available();
// Do we have a client?
if (!client) return;
Serial.println(F("New client"));
// Read the request (we ignore the content in this example)
while (client.available()) client.read();
// Allocate JsonBuffer
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonBuffer<500> jsonBuffer;
// Create the root object
JsonObject& root = jsonBuffer.createObject();
// Create the "analog" array
JsonArray& analogValues = root.createNestedArray("analog");
for (int pin = 0; pin < 6; pin++) {
// Read the analog input
int value = analogRead(pin);
// Add the value at the end of the array
analogValues.add(value);
}
// Create the "digital" array
JsonArray& digitalValues = root.createNestedArray("digital");
for (int pin = 0; pin < 14; pin++) {
// Read the digital input
int value = digitalRead(pin);
// Add the value at the end of the array
digitalValues.add(value);
}
Serial.print(F("Sending: "));
root.printTo(Serial);
Serial.println();
// Write response headers
client.println("HTTP/1.0 200 OK");
client.println("Content-Type: application/json");
client.println("Connection: close");
client.println();
// Write JSON document
root.prettyPrintTo(client);
// Disconnect
client.stop();
}
// See also
// --------
//
// 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/

View File

@ -0,0 +1,101 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows how to send a JSON document to a UDP socket.
// At regular interval, it sends a UDP packet that contains the status of
// analog and digital pins.
// The JSON document looks like the following:
// {
// "analog": [ 0, 1, 2, 3, 4, 5 ],
// "digital": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
// }
//
// If you want to test this program, you need to be able to receive the UDP
// packets.
// For example, you can run netcat on your computer
// $ ncat -ulp 8888
// See https://nmap.org/ncat/
#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress remoteIp(192, 168, 0, 108); // <- EDIT!!!!
unsigned short remotePort = 8888;
unsigned short localPort = 8888;
EthernetUDP udp;
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
// Initialize Ethernet libary
if (!Ethernet.begin(mac)) {
Serial.println(F("Failed to initialize Ethernet library"));
return;
}
// Enable UDP
udp.begin(localPort);
}
void loop() {
// Allocate JsonBuffer
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonBuffer<500> jsonBuffer;
// Create the root object
JsonObject& root = jsonBuffer.createObject();
// Create the "analog" array
JsonArray& analogValues = root.createNestedArray("analog");
for (int pin = 0; pin < 6; pin++) {
// Read the analog input
int value = analogRead(pin);
// Add the value at the end of the array
analogValues.add(value);
}
// Create the "digital" array
JsonArray& digitalValues = root.createNestedArray("digital");
for (int pin = 0; pin < 14; pin++) {
// Read the digital input
int value = digitalRead(pin);
// Add the value at the end of the array
digitalValues.add(value);
}
// Log
Serial.print(F("Sending to "));
Serial.print(remoteIp);
Serial.print(F(" on port "));
Serial.println(remotePort);
root.printTo(Serial);
// Send UDP packet
udp.beginPacket(remoteIp, remotePort);
root.printTo(udp);
udp.println();
udp.endPacket();
// Wait
delay(10000);
}
// See also
// --------
//
// 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/

View File

@ -0,0 +1,70 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows the different ways you can use Flash strings with
// ArduinoJson.
//
// Use Flash strings sparingly, because ArduinoJson duplicates them in the
// JsonBuffer. Prefer plain old char*, as they are more efficient in term of
// code size, speed, and memory usage.
#include <ArduinoJson.h>
void setup() {
#ifdef PROGMEM // <- check that Flash strings are supported
DynamicJsonBuffer jsonBuffer;
// You can use a Flash String as your JSON input.
// WARNING: the content of the Flash String will be duplicated in the
// JsonBuffer.
JsonObject& root =
jsonBuffer.parseObject(F("{\"sensor\":\"gps\",\"time\":1351824120,"
"\"data\":[48.756080,2.302038]}"));
// You can use a Flash String to get an element of a JsonObject
// No duplication is done.
long time = root[F("time")];
// You can use a Flash String to set an element of a JsonObject
// WARNING: the content of the Flash String will be duplicated in the
// JsonBuffer.
root[F("time")] = time;
// You can set a Flash String to a JsonObject or JsonArray:
// WARNING: the content of the Flash String will be duplicated in the
// JsonBuffer.
root["sensor"] = F("gps");
// It works with RawJson too:
root["sensor"] = RawJson(F("\"gps\""));
// You can compare the content of a JsonVariant to a Flash String
if (root["sensor"] == F("gps")) {
// ...
}
#else
#warning PROGMEM is not supported on this platform
#endif
}
void loop() {
// not used in this example
}
// See also
// --------
//
// 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/

View File

@ -0,0 +1,74 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
//
// This example shows the different ways you can use String with ArduinoJson.
//
// Use String objects sparingly, because ArduinoJson duplicates them in the
// JsonBuffer. Prefer plain old char[], as they are more efficient in term of
// code size, speed, and memory usage.
#include <ArduinoJson.h>
void setup() {
DynamicJsonBuffer jsonBuffer;
// You can use a String as your JSON input.
// WARNING: the content of the String will be duplicated in the JsonBuffer.
String input =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
JsonObject& root = jsonBuffer.parseObject(input);
// You can use a String to get an element of a JsonObject
// No duplication is done.
long time = root[String("time")];
// You can use a String to set an element of a JsonObject
// WARNING: the content of the String will be duplicated in the JsonBuffer.
root[String("time")] = time;
// You can get a String from a JsonObject or JsonArray:
// No duplication is done, at least not in the JsonBuffer.
String sensor = root["sensor"];
// Unfortunately, the following doesn't work (issue #118):
// sensor = root["sensor"]; // <- error "ambiguous overload for 'operator='"
// As a workaround, you need to replace by:
sensor = root["sensor"].as<String>();
// You can set a String to a JsonObject or JsonArray:
// WARNING: the content of the String will be duplicated in the JsonBuffer.
root["sensor"] = sensor;
// It works with RawJson too:
root["sensor"] = RawJson(sensor);
// You can also concatenate strings
// WARNING: the content of the String will be duplicated in the JsonBuffer.
root[String("sen") + "sor"] = String("gp") + "s";
// You can compare the content of a JsonObject with a String
if (root["sensor"] == sensor) {
// ...
}
// Lastly, you can print the resulting JSON to a String
String output;
root.printTo(output);
}
void loop() {
// not used in this example
}
// See also
// --------
//
// 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/

19
fuzzing/Makefile Normal file
View File

@ -0,0 +1,19 @@
# CAUTION: this file is invoked by https://github.com/google/oss-fuzz
CXXFLAGS += -I../src
all: \
$(OUT)/json_fuzzer \
$(OUT)/json_fuzzer_seed_corpus.zip \
$(OUT)/json_fuzzer.options
$(OUT)/json_fuzzer: fuzzer.cpp $(shell find ../src -type f)
$(CXX) $(CXXFLAGS) $< -o$@ $(LIB_FUZZING_ENGINE)
$(OUT)/json_fuzzer_seed_corpus.zip: seed_corpus/*
zip -j $@ $?
$(OUT)/json_fuzzer.options:
@echo "[libfuzzer]" > $@
@echo "max_len = 256" >> $@
@echo "timeout = 10" >> $@

9
fuzzing/fuzz.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
# This script mimics an invocation from https://github.com/google/oss-fuzz
cd $(dirname $0)
export CXX='clang++'
export CXXFLAGS='-fsanitize-coverage=trace-pc-guard -fsanitize=address'
export LIB_FUZZING_ENGINE=-lFuzzer
make OUT=.
./json_fuzzer my_corpus seed_corpus -max_len=1024 -timeout=10

26
fuzzing/fuzzer.cpp Normal file
View File

@ -0,0 +1,26 @@
#include <ArduinoJson.h>
class memstream : public std::istream {
struct membuf : std::streambuf {
membuf(const uint8_t *p, size_t l) {
setg((char *)p, (char *)p, (char *)p + l);
}
};
membuf _buffer;
public:
memstream(const uint8_t *p, size_t l)
: std::istream(&_buffer), _buffer(p, l) {
rdbuf(&_buffer);
}
};
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
DynamicJsonBuffer jsonBuffer;
memstream json(data, size);
JsonVariant variant = jsonBuffer.parse(json);
if (variant.success()) {
variant.as<std::string>(); // <- serialize to JSON
}
return 0;
}

2
fuzzing/my_corpus/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*
!.gitignore

View File

@ -0,0 +1,10 @@
//comment
/*comment*/
[ //comment
/*comment*/"comment"/*comment*/,//comment
/*comment*/{//comment
/* comment*/"key"//comment
: //comment
"value"//comment
}/*comment*/
]//comment

View File

@ -0,0 +1 @@
[]

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20,[21,[22,[23,[24,[25,[26,[27,[28,[29,[30,[31,[32,[33,[34,[35,[36,[37,[38,[39,[40,[41,[42,[43,[44,[45,[46,[47,[48,[49,[50,[51,[52,[53,[54,[55,[56,[57,[58,[59,[60,[61,[62,[63,[64,[65,[66,[67,[68,[69,[70,[71,[72,[73,[74,[75,[76,[77,[78,[79,[80,[81,[82,[83,[84,[85,[86,[87,[88,[89,[90,[91,[92,[93,[94,[95,[96,[97,[98,[99,[100,[101,[102,[103,[104,[105,[106,[107,[108,[109,[110,[111,[112,[113,[114,[115,[116,[117,[118,[119,[120]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

View File

@ -0,0 +1,24 @@
[
123,
-123,
123.456,
-123.456,
12e34,
12e-34,
12e+34,
12E34,
12E-34,
12E+34,
12.34e56,
12.34e-56,
12.34e+56,
12.34E56,
12.34E-56,
12.34E+56,
NaN,
-NaN,
+NaN,
Infinity,
+Infinity,
-Infinity
]

View File

@ -0,0 +1,53 @@
{
"coord": {
"lon": -0.13,
"lat": 51.51
},
"weather": [
{
"id": 301,
"main": "Drizzle",
"description": "drizzle",
"icon": "09n"
},
{
"id": 701,
"main": "Mist",
"description": "mist",
"icon": "50n"
},
{
"id": 741,
"main": "Fog",
"description": "fog",
"icon": "50n"
}
],
"base": "stations",
"main": {
"temp": 281.87,
"pressure": 1032,
"humidity": 100,
"temp_min": 281.15,
"temp_max": 283.15
},
"visibility": 2900,
"wind": {
"speed": 1.5
},
"clouds": {
"all": 90
},
"dt": 1483820400,
"sys": {
"type": 1,
"id": 5091,
"message": 0.0226,
"country": "GB",
"sunrise": 1483776245,
"sunset": 1483805443
},
"id": 2643743,
"name": "London",
"cod": 200
}

View File

@ -0,0 +1,8 @@
[
"hello",
'hello',
hello,
{"hello":"world"},
{'hello':'world'},
{hello:world}
]

View File

@ -0,0 +1,90 @@
{
"response": {
"version": "0.1",
"termsofService": "http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"conditions": 1
}
},
"current_observation": {
"image": {
"url": "http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png",
"title": "Weather Underground",
"link": "http://www.wunderground.com"
},
"display_location": {
"full": "San Francisco, CA",
"city": "San Francisco",
"state": "CA",
"state_name": "California",
"country": "US",
"country_iso3166": "US",
"zip": "94101",
"latitude": "37.77500916",
"longitude": "-122.41825867",
"elevation": "47.00000000"
},
"observation_location": {
"full": "SOMA - Near Van Ness, San Francisco, California",
"city": "SOMA - Near Van Ness, San Francisco",
"state": "California",
"country": "US",
"country_iso3166": "US",
"latitude": "37.773285",
"longitude": "-122.417725",
"elevation": "49 ft"
},
"estimated": {},
"station_id": "KCASANFR58",
"observation_time": "Last Updated on June 27, 5:27 PM PDT",
"observation_time_rfc822": "Wed, 27 Jun 2012 17:27:13 -0700",
"observation_epoch": "1340843233",
"local_time_rfc822": "Wed, 27 Jun 2012 17:27:14 -0700",
"local_epoch": "1340843234",
"local_tz_short": "PDT",
"local_tz_long": "America/Los_Angeles",
"local_tz_offset": "-0700",
"weather": "Partly Cloudy",
"temperature_string": "66.3 F (19.1 C)",
"temp_f": 66.3,
"temp_c": 19.1,
"relative_humidity": "65%",
"wind_string": "From the NNW at 22.0 MPH Gusting to 28.0 MPH",
"wind_dir": "NNW",
"wind_degrees": 346,
"wind_mph": 22,
"wind_gust_mph": "28.0",
"wind_kph": 35.4,
"wind_gust_kph": "45.1",
"pressure_mb": "1013",
"pressure_in": "29.93",
"pressure_trend": "+",
"dewpoint_string": "54 F (12 C)",
"dewpoint_f": 54,
"dewpoint_c": 12,
"heat_index_string": "NA",
"heat_index_f": "NA",
"heat_index_c": "NA",
"windchill_string": "NA",
"windchill_f": "NA",
"windchill_c": "NA",
"feelslike_string": "66.3 F (19.1 C)",
"feelslike_f": "66.3",
"feelslike_c": "19.1",
"visibility_mi": "10.0",
"visibility_km": "16.1",
"solarradiation": "",
"UV": "5",
"precip_1hr_string": "0.00 in ( 0 mm)",
"precip_1hr_in": "0.00",
"precip_1hr_metric": " 0",
"precip_today_string": "0.00 in (0 mm)",
"precip_today_in": "0.00",
"precip_today_metric": "0",
"icon": "partlycloudy",
"icon_url": "http://icons-ak.wxug.com/i/c/k/partlycloudy.gif",
"forecast_url": "http://www.wunderground.com/US/CA/San_Francisco.html",
"history_url": "http://www.wunderground.com/history/airport/KCASANFR58/2012/6/27/DailyHistory.html",
"ob_url": "http://www.wunderground.com/cgi-bin/findweather/getForecast?query=37.773285,-122.417725"
}
}

View File

@ -1,10 +1,15 @@
JsonParser KEYWORD1
JsonArray KEYWORD1
JsonHashTable KEYWORD1
getArray KEYWORD2
getBool KEYWORD2
getDouble KEYWORD2
getHashTableKEYWORD2
getLong KEYWORD2
JsonObject KEYWORD1
JsonVariant KEYWORD1
StaticJsonBuffer KEYWORD1
DynamicJsonBuffer KEYWORD1
add KEYWORD2
createArray KEYWORD2
createNestedArray KEYWORD2
createNestedObject KEYWORD2
createObject KEYWORD2
parseArray KEYWORD2
parseHashTable KEYWORD2
parseObject KEYWORD2
prettyPrintTo KEYWORD2
printTo KEYWORD2
success KEYWORD2

23
library.json Normal file
View File

@ -0,0 +1,23 @@
{
"name": "ArduinoJson",
"keywords": "json, rest, http, web",
"description": "An elegant and efficient JSON library for embedded systems",
"homepage": "https://arduinojson.org/?utm_source=meta&utm_medium=library.json",
"repository": {
"type": "git",
"url": "https://github.com/bblanchon/ArduinoJson.git"
},
"version": "5.13.0",
"authors": {
"name": "Benoit Blanchon",
"url": "https://blog.benoitblanchon.fr"
},
"exclude": [
"fuzzing",
"scripts",
"test",
"third-party"
],
"frameworks": "arduino",
"platforms": "*"
}

11
library.properties Normal file
View File

@ -0,0 +1,11 @@
name=ArduinoJson
version=5.13.0
author=Benoit Blanchon <blog.benoitblanchon.fr>
maintainer=Benoit Blanchon <blog.benoitblanchon.fr>
sentence=An efficient and elegant JSON library for Arduino.
paragraph=ArduinoJson supports ✔ serialization, ✔ deserialization, ✔ fixed allocation, ✔ zero-copy, ✔ streams, and more. It is the most popular Arduino library on GitHub ❤❤❤❤❤. Check out arduinojson.org for a comprehensive documentation.
category=Data Processing
url=https://arduinojson.org/?utm_source=meta&utm_medium=library.properties
architectures=*
repository=https://github.com/bblanchon/ArduinoJson.git
license=MIT

View File

@ -0,0 +1,20 @@
#!/bin/bash
TAG=$(git describe)
OUTPUT="ArduinoJson-$TAG.zip"
cd $(dirname $0)/../..
# remove existing file
rm -f $OUTPUT
# create zip
7z a $OUTPUT \
ArduinoJson/CHANGELOG.md \
ArduinoJson/examples \
ArduinoJson/src \
ArduinoJson/keywords.txt \
ArduinoJson/library.properties \
ArduinoJson/LICENSE.md \
ArduinoJson/README.md \
ArduinoJson/ArduinoJson.h

View File

@ -0,0 +1,53 @@
#!/bin/bash
TAG=$(git describe)
RE_INCLUDE='^#include[[:space:]]*["<](.*)[">]'
RE_EMPTY='^(#pragma[[:space:]]+once)?[[:space:]]*(//.*)?$'
declare -A INCLUDED
process()
{
local PARENT=$1
local FOLDER=$(dirname $1)
local SHOW_COMMENT=$2
while IFS= read -r LINE; do
if [[ $LINE =~ $RE_INCLUDE ]]; then
local CHILD=${BASH_REMATCH[1]}
pushd "$FOLDER" > /dev/null
if [[ -e $CHILD ]]; then
local CHILD_PATH=$(realpath $CHILD)
if [[ ! ${INCLUDED[$CHILD_PATH]} ]]; then
#echo "// $PARENT -> $CHILD"
INCLUDED[$CHILD_PATH]=true
process "$CHILD" false
fi
else
if [[ ! ${INCLUDED[$CHILD]} ]]; then
echo "$LINE"
INCLUDED[$CHILD]=true
fi
fi
popd > /dev/null
elif [[ "${SHOW_COMMENT}" = "true" ]] ; then
echo "$LINE"
elif [[ ! $LINE =~ $RE_EMPTY ]]; then
echo "$LINE"
fi
done < $PARENT
}
cd $(dirname $0)/../
INCLUDED=()
process src/ArduinoJson.h true > ../ArduinoJson-$TAG.h
g++ -x c++ -c -o ../smoketest.o - <<END
#include "../ArduinoJson-$TAG.h"
int main() {}
END
INCLUDED=()
process src/ArduinoJson.hpp true > ../ArduinoJson-$TAG.hpp
g++ -x c++ -c -o ../smoketest.o - <<END
#include "../ArduinoJson-$TAG.hpp"
int main() {}
END

29
scripts/create-build-envs.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
export PATH="$PATH:/Applications/CMake.app/Contents/bin/"
cd $(dirname $0)/..
ROOT=$(pwd)
mkdir "build"
cd build
BUILD=$(pwd)
build-env()
{
cd $BUILD
mkdir "$1"
cd "$1"
cmake "$ROOT" -G "$2"
}
if [[ $(uname) == MINGW* ]]
then
build-env "Make" "MinGW Makefiles"
build-env "SublimeText" "Sublime Text 2 - Ninja"
build-env "VisualStudio" "Visual Studio 14 2015"
else
build-env "SublimeText" "Sublime Text 2 - Ninja"
build-env "Make" "Unix Makefiles"
build-env "Xcode" "Xcode"
fi

42
scripts/create-size-graph.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/bash
set -eu
OUTPUT="$(pwd)/sizes.csv"
echo "Tag;Date;Parser;Generator" > $OUTPUT
cd $(dirname $(dirname $0))
git tag | while read TAG
do
git checkout -q tags/$TAG
DATE=$(git log -1 --date=short --pretty=format:%cd)
PARSER_SIZE=$(arduino --verify examples/JsonParserExample/JsonParserExample.ino 2>/dev/null | grep -e 'Sketch uses' | sed 's/.*uses \([0-9]*\).\([0-9]\+\).*/\1\2/')
if [ -e 'examples/JsonGeneratorExample/JsonGeneratorExample.ino' ]; then
GENERATOR_SIZE=$(arduino --verify examples/JsonGeneratorExample/JsonGeneratorExample.ino 2>/dev/null | grep -e 'Sketch uses' | sed 's/.*uses \([0-9]*\).\([0-9]\+\).*/\1\2/')
else
GENERATOR_SIZE=""
fi
echo $TAG
if [ ! -z "$PARSER_SIZE" ]
then
echo "JsonParserExample = $PARSER_SIZE bytes"
else
echo "JsonParserExample compilation failed."
fi
if [ ! -z "$GENERATOR_SIZE" ]
then
echo "JsonGeneratorExample = $GENERATOR_SIZE bytes"
else
echo "JsonGeneratorExample compilation failed."
fi
echo "$TAG;$DATE;$PARSER_SIZE;$GENERATOR_SIZE" >> $OUTPUT
done

2
scripts/oss-fuzz/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/.vagrant/
*.log

33
scripts/oss-fuzz/Vagrantfile vendored Normal file
View File

@ -0,0 +1,33 @@
# A virtual machine to run https://github.com/google/oss-fuzz
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.synced_folder "E:\\Git\\Arduino\\libraries\\ArduinoJson", "/host/ArduinoJson"
config.vm.synced_folder "E:\\Git\\oss-fuzz", "/host/oss-fuzz"
config.vm.network "forwarded_port", guest: 8001, host: 8001
config.vm.provision "shell", privileged: false, inline: <<-SHELL
set -x
sudo apt-get update
sudo apt-get install -y make git docker.io zip
sudo groupadd docker
sudo usermod -aG docker $USER
git clone https://github.com/google/fuzzer-test-suite.git FTS
./FTS/tutorial/install-deps.sh # Get deps
./FTS/tutorial/install-clang.sh # Get fresh clang binaries
# Get libFuzzer sources and build it
svn co http://llvm.org/svn/llvm-project/llvm/trunk/lib/Fuzzer
Fuzzer/build.sh
sudo mv libFuzzer.a /usr/local/lib/
echo "export PROJECT_NAME='arduinojson'" >> $HOME/.profile
echo "export CC='clang'" >> $HOME/.profile
echo "export CXX='clang++'" >> $HOME/.profile
echo "export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/" >> $HOME/.profile
echo "Run /host/ArduinoJson/fuzzing/fuzz.sh" | sudo tee /etc/motd
SHELL
end

16
scripts/travis/arduino.sh Executable file
View File

@ -0,0 +1,16 @@
#!/bin/sh -eux
/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16
sleep 3
export DISPLAY=:1.0
mkdir -p /tmp/arduino
curl -sS http://downloads.arduino.cc/arduino-$VERSION-linux64.tar.xz | tar xJ -C /tmp/arduino --strip 1 ||
curl -sS http://downloads.arduino.cc/arduino-$VERSION-linux64.tgz | tar xz -C /tmp/arduino --strip 1
export PATH=$PATH:/tmp/arduino/
ln -s $PWD /tmp/arduino/libraries/ArduinoJson
for EXAMPLE in $PWD/examples/*/*.ino; do
arduino --verify --board $BOARD $EXAMPLE
done

30
scripts/travis/cmake.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh -ex
if [ $(uname) = 'Darwin' ]; then
URL=https://cmake.org/files/v3.4/cmake-3.4.3-Darwin-x86_64.tar.gz
CMAKE=/tmp/CMake.app/Contents/bin/cmake
CTEST=/tmp/CMake.app/Contents/bin/ctest
else
URL=https://cmake.org/files/v3.4/cmake-3.4.3-Linux-x86_64.tar.gz
CMAKE=/tmp/bin/cmake
CTEST=/tmp/bin/ctest
fi
curl -sS $URL | tar xz -C /tmp --strip 1
if [ -n "$GCC" ]; then
export CC="gcc-$GCC"
export CXX="g++-$GCC"
fi
if [ -n "$CLANG" ]; then
export CC="clang-$CLANG"
export CXX="clang++-$CLANG"
fi
if [ -n "$SANITIZE" ]; then
export CXXFLAGS="-fsanitize=$SANITIZE"
fi
$CMAKE .
$CMAKE --build .
$CTEST --output-on-failure .

10
scripts/travis/coverage.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh -eux
curl https://cmake.org/files/v3.4/cmake-3.4.0-Linux-x86_64.tar.gz | tar xz -C /tmp --strip 1
/tmp/bin/cmake -DCOVERAGE=true .
make
make test
pip install --user cpp-coveralls 'requests[security]'
coveralls --exclude third-party --gcov-options '\-lp'; fi

10
scripts/travis/platformio.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh -eux
pip install --user platformio
rm -r test
for EXAMPLE in $PWD/examples/*/*.ino;
do
platformio ci $EXAMPLE -l '.' -b $BOARD
done

17
src/ArduinoJson.h Normal file
View File

@ -0,0 +1,17 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#ifdef __cplusplus
#include "ArduinoJson.hpp"
using namespace ArduinoJson;
#else
#error ArduinoJson requires a C++ compiler, please change file extension to .cc or .cpp
#endif

17
src/ArduinoJson.hpp Normal file
View File

@ -0,0 +1,17 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "ArduinoJson/DynamicJsonBuffer.hpp"
#include "ArduinoJson/JsonArray.hpp"
#include "ArduinoJson/JsonObject.hpp"
#include "ArduinoJson/StaticJsonBuffer.hpp"
#include "ArduinoJson/Deserialization/JsonParserImpl.hpp"
#include "ArduinoJson/JsonArrayImpl.hpp"
#include "ArduinoJson/JsonBufferImpl.hpp"
#include "ArduinoJson/JsonObjectImpl.hpp"
#include "ArduinoJson/JsonVariantImpl.hpp"
#include "ArduinoJson/Serialization/JsonSerializerImpl.hpp"

View File

@ -0,0 +1,151 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
// Small or big machine?
#ifndef ARDUINOJSON_EMBEDDED_MODE
#if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \
defined(__ARMCC_VERSION)
#define ARDUINOJSON_EMBEDDED_MODE 1
#else
#define ARDUINOJSON_EMBEDDED_MODE 0
#endif
#endif
#if ARDUINOJSON_EMBEDDED_MODE
// Store floats by default to reduce the memory usage (issue #134)
#ifndef ARDUINOJSON_USE_DOUBLE
#define ARDUINOJSON_USE_DOUBLE 0
#endif
// Store longs by default, because they usually match the size of a float.
#ifndef ARDUINOJSON_USE_LONG_LONG
#define ARDUINOJSON_USE_LONG_LONG 0
#endif
#ifndef ARDUINOJSON_USE_INT64
#define ARDUINOJSON_USE_INT64 0
#endif
// Embedded systems usually don't have std::string
#ifndef ARDUINOJSON_ENABLE_STD_STRING
#define ARDUINOJSON_ENABLE_STD_STRING 0
#endif
// Embedded systems usually don't have std::stream
#ifndef ARDUINOJSON_ENABLE_STD_STREAM
#define ARDUINOJSON_ENABLE_STD_STREAM 0
#endif
// Limit nesting as the stack is likely to be small
#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT
#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10
#endif
#else // ARDUINOJSON_EMBEDDED_MODE
// On a computer we have plenty of memory so we can use doubles
#ifndef ARDUINOJSON_USE_DOUBLE
#define ARDUINOJSON_USE_DOUBLE 1
#endif
// Use long long when available
#ifndef ARDUINOJSON_USE_LONG_LONG
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
#define ARDUINOJSON_USE_LONG_LONG 1
#else
#define ARDUINOJSON_USE_LONG_LONG 0
#endif
#endif
// Use _int64 on old versions of Visual Studio
#ifndef ARDUINOJSON_USE_INT64
#if defined(_MSC_VER) && _MSC_VER <= 1700
#define ARDUINOJSON_USE_INT64 1
#else
#define ARDUINOJSON_USE_INT64 0
#endif
#endif
// On a computer, we can use std::string
#ifndef ARDUINOJSON_ENABLE_STD_STRING
#define ARDUINOJSON_ENABLE_STD_STRING 1
#endif
// On a computer, we can assume std::stream
#ifndef ARDUINOJSON_ENABLE_STD_STREAM
#define ARDUINOJSON_ENABLE_STD_STREAM 1
#endif
// On a computer, the stack is large so we can increase nesting limit
#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT
#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 50
#endif
#endif // ARDUINOJSON_EMBEDDED_MODE
#ifdef ARDUINO
// Enable support for Arduino String
#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING
#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1
#endif
// Enable support for Arduino Stream
#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM
#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1
#endif
#else // ARDUINO
// Disable support for Arduino String
#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING
#define ARDUINOJSON_ENABLE_ARDUINO_STRING 0
#endif
// Disable support for Arduino Stream
#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM
#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0
#endif
#endif // ARDUINO
#ifndef ARDUINOJSON_ENABLE_PROGMEM
#ifdef PROGMEM
#define ARDUINOJSON_ENABLE_PROGMEM 1
#else
#define ARDUINOJSON_ENABLE_PROGMEM 0
#endif
#endif
#ifndef ARDUINOJSON_ENABLE_ALIGNMENT
#ifdef ARDUINO_ARCH_AVR
// alignment isn't needed for 8-bit AVR
#define ARDUINOJSON_ENABLE_ALIGNMENT 0
#else
// but most processors need pointers to be align on word size
#define ARDUINOJSON_ENABLE_ALIGNMENT 1
#endif
#endif
// Enable deprecated functions by default
#ifndef ARDUINOJSON_ENABLE_DEPRECATED
#define ARDUINOJSON_ENABLE_DEPRECATED 1
#endif
// Control the exponentiation threshold for big numbers
// CAUTION: cannot be more that 1e9 !!!!
#ifndef ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD
#define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7
#endif
// Control the exponentiation threshold for small numbers
#ifndef ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD
#define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5
#endif
#if ARDUINOJSON_USE_LONG_LONG && ARDUINOJSON_USE_INT64
#error ARDUINOJSON_USE_LONG_LONG and ARDUINOJSON_USE_INT64 cannot be set together
#endif

View File

@ -0,0 +1,37 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
class Encoding {
public:
// Optimized for code size on a 8-bit AVR
static char escapeChar(char c) {
const char *p = escapeTable(false);
while (p[0] && p[1] != c) {
p += 2;
}
return p[0];
}
// Optimized for code size on a 8-bit AVR
static char unescapeChar(char c) {
const char *p = escapeTable(true);
for (;;) {
if (p[0] == '\0') return c;
if (p[0] == c) return p[1];
p += 2;
}
}
private:
static const char *escapeTable(bool excludeIdenticals) {
return &"\"\"\\\\b\bf\fn\nr\rt\t"[excludeIdenticals ? 4 : 0];
}
};
}
}

View File

@ -0,0 +1,22 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "../JsonBuffer.hpp"
namespace ArduinoJson {
namespace Internals {
class JsonBufferAllocated {
public:
void *operator new(size_t n, JsonBuffer *jsonBuffer) throw() {
if (!jsonBuffer) return NULL;
return jsonBuffer->alloc(n);
}
void operator delete(void *, JsonBuffer *)throw();
};
}
}

View File

@ -0,0 +1,18 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "../Configuration.hpp"
namespace ArduinoJson {
namespace Internals {
#if ARDUINOJSON_USE_DOUBLE
typedef double JsonFloat;
#else
typedef float JsonFloat;
#endif
}
}

View File

@ -0,0 +1,23 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "../Configuration.hpp"
namespace ArduinoJson {
namespace Internals {
#if ARDUINOJSON_USE_LONG_LONG
typedef long long JsonInteger;
typedef unsigned long long JsonUInt;
#elif ARDUINOJSON_USE_INT64
typedef __int64 JsonInteger;
typedef unsigned _int64 JsonUInt;
#else
typedef long JsonInteger;
typedef unsigned long JsonUInt;
#endif
}
}

View File

@ -0,0 +1,42 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
// A metafunction that returns the type of the value returned by
// JsonVariant::as<T>()
template <typename T>
struct JsonVariantAs {
typedef T type;
};
template <>
struct JsonVariantAs<char*> {
typedef const char* type;
};
template <>
struct JsonVariantAs<JsonArray> {
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;
};
}
}

View File

@ -0,0 +1,27 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "JsonFloat.hpp"
#include "JsonInteger.hpp"
namespace ArduinoJson {
// Forward declarations
class JsonArray;
class JsonObject;
namespace Internals {
// A union that defines the actual content of a JsonVariant.
// The enum JsonVariantType determines which member is in use.
union JsonVariantContent {
JsonFloat asFloat; // used for double and float
JsonUInt asInteger; // used for bool, char, short, int and longs
const char* asString; // asString can be null
JsonArray* asArray; // asArray cannot be null
JsonObject* asObject; // asObject cannot be null
};
}
}

View File

@ -0,0 +1,23 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
template <typename T>
struct JsonVariantDefault {
static T get() {
return T();
}
};
template <typename T>
struct JsonVariantDefault<const T> : JsonVariantDefault<T> {};
template <typename T>
struct JsonVariantDefault<T&> : JsonVariantDefault<T> {};
}
}

View File

@ -0,0 +1,27 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
class JsonArray;
class JsonObject;
namespace Internals {
// Enumerated type to know the current type of a JsonVariant.
// The value determines which member of JsonVariantContent is used.
enum JsonVariantType {
JSON_UNDEFINED, // JsonVariant has not been initialized
JSON_UNPARSED, // JsonVariant contains an unparsed string
JSON_STRING, // JsonVariant stores a const char*
JSON_BOOLEAN, // JsonVariant stores a bool
JSON_POSITIVE_INTEGER, // JsonVariant stores an JsonUInt
JSON_NEGATIVE_INTEGER, // JsonVariant stores an JsonUInt that must be negated
JSON_ARRAY, // JsonVariant stores a pointer to a JsonArray
JSON_OBJECT, // JsonVariant stores a pointer to a JsonObject
JSON_FLOAT // JsonVariant stores a JsonFloat
};
}
}

View File

@ -0,0 +1,94 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "../JsonBuffer.hpp"
#include "ListConstIterator.hpp"
#include "ListIterator.hpp"
namespace ArduinoJson {
namespace Internals {
// A singly linked list of T.
// The linked list is composed of ListNode<T>.
// It is derived by JsonArray and JsonObject
template <typename T>
class List {
public:
typedef T value_type;
typedef ListNode<T> node_type;
typedef ListIterator<T> 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 *buffer) : _buffer(buffer), _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.
// For a JsonObject, it would return the number of key-value pairs
size_t size() const {
size_t nodeCount = 0;
for (node_type *node = _firstNode; node; node = node->next) nodeCount++;
return nodeCount;
}
iterator add() {
node_type *newNode = new (_buffer) node_type();
if (_firstNode) {
node_type *lastNode = _firstNode;
while (lastNode->next) lastNode = lastNode->next;
lastNode->next = newNode;
} else {
_firstNode = newNode;
}
return iterator(newNode);
}
iterator begin() {
return iterator(_firstNode);
}
iterator end() {
return iterator(NULL);
}
const_iterator begin() const {
return const_iterator(_firstNode);
}
const_iterator end() const {
return const_iterator(NULL);
}
void remove(iterator it) {
node_type *nodeToRemove = it._node;
if (!nodeToRemove) return;
if (nodeToRemove == _firstNode) {
_firstNode = nodeToRemove->next;
} else {
for (node_type *node = _firstNode; node; node = node->next)
if (node->next == nodeToRemove) node->next = nodeToRemove->next;
}
}
protected:
JsonBuffer *_buffer;
private:
node_type *_firstNode;
};
}
}

View File

@ -0,0 +1,50 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "ListNode.hpp"
namespace ArduinoJson {
namespace Internals {
// A read-only forward itertor for List<T>
template <typename T>
class ListConstIterator {
public:
explicit ListConstIterator(const ListNode<T> *node = NULL) : _node(node) {}
const T &operator*() const {
return _node->content;
}
const T *operator->() {
return &_node->content;
}
bool operator==(const ListConstIterator<T> &other) const {
return _node == other._node;
}
bool operator!=(const ListConstIterator<T> &other) const {
return _node != other._node;
}
ListConstIterator<T> &operator++() {
if (_node) _node = _node->next;
return *this;
}
ListConstIterator<T> &operator+=(size_t distance) {
while (_node && distance) {
_node = _node->next;
--distance;
}
return *this;
}
private:
const ListNode<T> *_node;
};
}
}

View File

@ -0,0 +1,60 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "ListConstIterator.hpp"
#include "ListNode.hpp"
namespace ArduinoJson {
namespace Internals {
template <typename T>
class List;
// A read-write forward iterator for List<T>
template <typename T>
class ListIterator {
friend class List<T>;
public:
explicit ListIterator(ListNode<T> *node = NULL) : _node(node) {}
T &operator*() const {
return _node->content;
}
T *operator->() {
return &_node->content;
}
bool operator==(const ListIterator<T> &other) const {
return _node == other._node;
}
bool operator!=(const ListIterator<T> &other) const {
return _node != other._node;
}
ListIterator<T> &operator++() {
if (_node) _node = _node->next;
return *this;
}
ListIterator<T> &operator+=(size_t distance) {
while (_node && distance) {
_node = _node->next;
--distance;
}
return *this;
}
operator ListConstIterator<T>() const {
return ListConstIterator<T>(_node);
}
private:
ListNode<T> *_node;
};
}
}

View File

@ -0,0 +1,24 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include <stddef.h> // for NULL
#include "JsonBufferAllocated.hpp"
namespace ArduinoJson {
namespace Internals {
// A node for a singly-linked list.
// Used by List<T> and its iterators.
template <typename T>
struct ListNode : public Internals::JsonBufferAllocated {
ListNode() throw() : next(NULL) {}
ListNode<T> *next;
T content;
};
}
}

View File

@ -0,0 +1,23 @@
// 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&);
};
}
}

View File

@ -0,0 +1,24 @@
// 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;
}
};
}
}

View File

@ -0,0 +1,52 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "../JsonBuffer.hpp"
#include "../JsonVariant.hpp"
#include "../StringTraits/StringTraits.hpp"
#include "../TypeTraits/EnableIf.hpp"
namespace ArduinoJson {
namespace Internals {
template <typename Source, typename Enable = void>
struct ValueSaver {
template <typename Destination>
static bool save(JsonBuffer*, Destination& destination, Source source) {
destination = source;
return true;
}
};
template <typename Source>
struct ValueSaver<
Source, typename EnableIf<StringTraits<Source>::should_duplicate>::type> {
template <typename Destination>
static bool save(JsonBuffer* buffer, Destination& dest, Source source) {
if (!StringTraits<Source>::is_null(source)) {
typename StringTraits<Source>::duplicate_t dup =
StringTraits<Source>::duplicate(source, buffer);
if (!dup) return false;
dest = dup;
} else {
dest = reinterpret_cast<const char*>(0);
}
return true;
}
};
// const char*, const signed char*, const unsigned char*
template <typename Char>
struct ValueSaver<
Char*, typename EnableIf<!StringTraits<Char*>::should_duplicate>::type> {
template <typename Destination>
static bool save(JsonBuffer*, Destination& dest, Char* source) {
dest = reinterpret_cast<const char*>(source);
return true;
}
};
}
}

View File

@ -0,0 +1,61 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
template <typename TInput>
void skipSpacesAndComments(TInput& input) {
for (;;) {
switch (input.current()) {
// spaces
case ' ':
case '\t':
case '\r':
case '\n':
input.move();
continue;
// comments
case '/':
switch (input.next()) {
// C-style block comment
case '*':
input.move(); // skip '/'
// no need to skip '*'
for (;;) {
input.move();
if (input.current() == '\0') return;
if (input.current() == '*' && input.next() == '/') {
input.move(); // skip '*'
input.move(); // skip '/'
break;
}
}
break;
// C++-style line comment
case '/':
// not need to skip "//"
for (;;) {
input.move();
if (input.current() == '\0') return;
if (input.current() == '\n') break;
}
break;
// not a comment, just a '/'
default:
return;
}
break;
default:
return;
}
}
}
}
}

View File

@ -0,0 +1,103 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "../JsonBuffer.hpp"
#include "../JsonVariant.hpp"
#include "../TypeTraits/IsConst.hpp"
#include "StringWriter.hpp"
namespace ArduinoJson {
namespace Internals {
// Parse JSON string to create JsonArrays and JsonObjects
// This internal class is not indended to be used directly.
// Instead, use JsonBuffer.parseArray() or .parseObject()
template <typename TReader, typename TWriter>
class JsonParser {
public:
JsonParser(JsonBuffer *buffer, TReader reader, TWriter writer,
uint8_t nestingLimit)
: _buffer(buffer),
_reader(reader),
_writer(writer),
_nestingLimit(nestingLimit) {}
JsonArray &parseArray();
JsonObject &parseObject();
JsonVariant parseVariant() {
JsonVariant result;
parseAnythingTo(&result);
return result;
}
private:
JsonParser &operator=(const JsonParser &); // non-copiable
static bool eat(TReader &, char charToSkip);
FORCE_INLINE bool eat(char charToSkip) {
return eat(_reader, charToSkip);
}
const char *parseString();
bool parseAnythingTo(JsonVariant *destination);
FORCE_INLINE bool parseAnythingToUnsafe(JsonVariant *destination);
inline bool parseArrayTo(JsonVariant *destination);
inline bool parseObjectTo(JsonVariant *destination);
inline bool parseStringTo(JsonVariant *destination);
static inline bool isInRange(char c, char min, char max) {
return min <= c && c <= max;
}
static inline bool isLetterOrNumber(char c) {
return isInRange(c, '0', '9') || isInRange(c, 'a', 'z') ||
isInRange(c, 'A', 'Z') || c == '+' || c == '-' || c == '.';
}
static inline bool isQuote(char c) {
return c == '\'' || c == '\"';
}
JsonBuffer *_buffer;
TReader _reader;
TWriter _writer;
uint8_t _nestingLimit;
};
template <typename TJsonBuffer, typename TString, typename Enable = void>
struct JsonParserBuilder {
typedef typename StringTraits<TString>::Reader InputReader;
typedef JsonParser<InputReader, TJsonBuffer &> TParser;
static TParser makeParser(TJsonBuffer *buffer, TString &json,
uint8_t nestingLimit) {
return TParser(buffer, InputReader(json), *buffer, nestingLimit);
}
};
template <typename TJsonBuffer, typename TChar>
struct JsonParserBuilder<TJsonBuffer, TChar *,
typename EnableIf<!IsConst<TChar>::value>::type> {
typedef typename StringTraits<TChar *>::Reader TReader;
typedef StringWriter<TChar> TWriter;
typedef JsonParser<TReader, TWriter> TParser;
static TParser makeParser(TJsonBuffer *buffer, TChar *json,
uint8_t nestingLimit) {
return TParser(buffer, TReader(json), TWriter(json), nestingLimit);
}
};
template <typename TJsonBuffer, typename TString>
inline typename JsonParserBuilder<TJsonBuffer, TString>::TParser makeParser(
TJsonBuffer *buffer, TString &json, uint8_t nestingLimit) {
return JsonParserBuilder<TJsonBuffer, TString>::makeParser(buffer, json,
nestingLimit);
}
}
}

View File

@ -0,0 +1,192 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Comments.hpp"
#include "JsonParser.hpp"
template <typename TReader, typename TWriter>
inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::eat(
TReader &reader, char charToSkip) {
skipSpacesAndComments(reader);
if (reader.current() != charToSkip) return false;
reader.move();
return true;
}
template <typename TReader, typename TWriter>
inline bool
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseAnythingTo(
JsonVariant *destination) {
if (_nestingLimit == 0) return false;
_nestingLimit--;
bool success = parseAnythingToUnsafe(destination);
_nestingLimit++;
return success;
}
template <typename TReader, typename TWriter>
inline bool
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseAnythingToUnsafe(
JsonVariant *destination) {
skipSpacesAndComments(_reader);
switch (_reader.current()) {
case '[':
return parseArrayTo(destination);
case '{':
return parseObjectTo(destination);
default:
return parseStringTo(destination);
}
}
template <typename TReader, typename TWriter>
inline ArduinoJson::JsonArray &
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseArray() {
// Create an empty array
JsonArray &array = _buffer->createArray();
// Check opening braket
if (!eat('[')) goto ERROR_MISSING_BRACKET;
if (eat(']')) goto SUCCESS_EMPTY_ARRAY;
// Read each value
for (;;) {
// 1 - Parse value
JsonVariant value;
if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE;
if (!array.add(value)) goto ERROR_NO_MEMORY;
// 2 - More values?
if (eat(']')) goto SUCCES_NON_EMPTY_ARRAY;
if (!eat(',')) goto ERROR_MISSING_COMMA;
}
SUCCESS_EMPTY_ARRAY:
SUCCES_NON_EMPTY_ARRAY:
return array;
ERROR_INVALID_VALUE:
ERROR_MISSING_BRACKET:
ERROR_MISSING_COMMA:
ERROR_NO_MEMORY:
return JsonArray::invalid();
}
template <typename TReader, typename TWriter>
inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseArrayTo(
JsonVariant *destination) {
JsonArray &array = parseArray();
if (!array.success()) return false;
*destination = array;
return true;
}
template <typename TReader, typename TWriter>
inline ArduinoJson::JsonObject &
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseObject() {
// Create an empty object
JsonObject &object = _buffer->createObject();
// Check opening brace
if (!eat('{')) goto ERROR_MISSING_BRACE;
if (eat('}')) goto SUCCESS_EMPTY_OBJECT;
// Read each key value pair
for (;;) {
// 1 - Parse key
const char *key = parseString();
if (!key) goto ERROR_INVALID_KEY;
if (!eat(':')) goto ERROR_MISSING_COLON;
// 2 - Parse value
JsonVariant value;
if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE;
if (!object.set(key, value)) goto ERROR_NO_MEMORY;
// 3 - More keys/values?
if (eat('}')) goto SUCCESS_NON_EMPTY_OBJECT;
if (!eat(',')) goto ERROR_MISSING_COMMA;
}
SUCCESS_EMPTY_OBJECT:
SUCCESS_NON_EMPTY_OBJECT:
return object;
ERROR_INVALID_KEY:
ERROR_INVALID_VALUE:
ERROR_MISSING_BRACE:
ERROR_MISSING_COLON:
ERROR_MISSING_COMMA:
ERROR_NO_MEMORY:
return JsonObject::invalid();
}
template <typename TReader, typename TWriter>
inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseObjectTo(
JsonVariant *destination) {
JsonObject &object = parseObject();
if (!object.success()) return false;
*destination = object;
return true;
}
template <typename TReader, typename TWriter>
inline const char *
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseString() {
typename RemoveReference<TWriter>::type::String str = _writer.startString();
skipSpacesAndComments(_reader);
char c = _reader.current();
if (isQuote(c)) { // quotes
_reader.move();
char stopChar = c;
for (;;) {
c = _reader.current();
if (c == '\0') break;
_reader.move();
if (c == stopChar) break;
if (c == '\\') {
// replace char
c = Encoding::unescapeChar(_reader.current());
if (c == '\0') break;
_reader.move();
}
str.append(c);
}
} else { // no quotes
for (;;) {
if (!isLetterOrNumber(c)) break;
_reader.move();
str.append(c);
c = _reader.current();
}
}
return str.c_str();
}
template <typename TReader, typename TWriter>
inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseStringTo(
JsonVariant *destination) {
bool hasQuotes = isQuote(_reader.current());
const char *value = parseString();
if (value == NULL) return false;
if (hasQuotes) {
*destination = value;
} else {
*destination = RawJson(value);
}
return true;
}

View File

@ -0,0 +1,41 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
template <typename TChar>
class StringWriter {
public:
class String {
public:
String(TChar** ptr) : _writePtr(ptr), _startPtr(*ptr) {}
void append(char c) {
*(*_writePtr)++ = TChar(c);
}
const char* c_str() const {
*(*_writePtr)++ = 0;
return reinterpret_cast<const char*>(_startPtr);
}
private:
TChar** _writePtr;
TChar* _startPtr;
};
StringWriter(TChar* buffer) : _ptr(buffer) {}
String startString() {
return String(&_ptr);
}
private:
TChar* _ptr;
};
}
}

View File

@ -0,0 +1,170 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "JsonBufferBase.hpp"
#include <stdlib.h>
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
#elif defined(__GNUC__)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic push
#endif
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif
namespace ArduinoJson {
namespace Internals {
class DefaultAllocator {
public:
void* allocate(size_t size) {
return malloc(size);
}
void deallocate(void* pointer) {
free(pointer);
}
};
template <typename TAllocator>
class DynamicJsonBufferBase
: public JsonBufferBase<DynamicJsonBufferBase<TAllocator> > {
struct Block;
struct EmptyBlock {
Block* next;
size_t capacity;
size_t size;
};
struct Block : EmptyBlock {
uint8_t data[1];
};
public:
enum { EmptyBlockSize = sizeof(EmptyBlock) };
DynamicJsonBufferBase(size_t initialSize = 256)
: _head(NULL), _nextBlockCapacity(initialSize) {}
~DynamicJsonBufferBase() {
clear();
}
// Gets the number of bytes occupied in the buffer
size_t size() const {
size_t total = 0;
for (const Block* b = _head; b; b = b->next) total += b->size;
return total;
}
// Allocates the specified amount of bytes in the buffer
virtual void* alloc(size_t bytes) {
alignNextAlloc();
return canAllocInHead(bytes) ? allocInHead(bytes) : allocInNewBlock(bytes);
}
// Resets the buffer.
// USE WITH CAUTION: this invalidates all previously allocated data
void clear() {
Block* currentBlock = _head;
while (currentBlock != NULL) {
_nextBlockCapacity = currentBlock->capacity;
Block* nextBlock = currentBlock->next;
_allocator.deallocate(currentBlock);
currentBlock = nextBlock;
}
_head = 0;
}
class String {
public:
String(DynamicJsonBufferBase* parent)
: _parent(parent), _start(NULL), _length(0) {}
void append(char c) {
if (_parent->canAllocInHead(1)) {
char* end = static_cast<char*>(_parent->allocInHead(1));
*end = c;
if (_length == 0) _start = end;
} else {
char* newStart =
static_cast<char*>(_parent->allocInNewBlock(_length + 1));
if (_start && newStart) memcpy(newStart, _start, _length);
if (newStart) newStart[_length] = c;
_start = newStart;
}
_length++;
}
const char* c_str() {
append(0);
return _start;
}
private:
DynamicJsonBufferBase* _parent;
char* _start;
size_t _length;
};
String startString() {
return String(this);
}
private:
void alignNextAlloc() {
if (_head) _head->size = this->round_size_up(_head->size);
}
bool canAllocInHead(size_t bytes) const {
return _head != NULL && _head->size + bytes <= _head->capacity;
}
void* allocInHead(size_t bytes) {
void* p = _head->data + _head->size;
_head->size += bytes;
return p;
}
void* allocInNewBlock(size_t bytes) {
size_t capacity = _nextBlockCapacity;
if (bytes > capacity) capacity = bytes;
if (!addNewBlock(capacity)) return NULL;
_nextBlockCapacity *= 2;
return allocInHead(bytes);
}
bool addNewBlock(size_t capacity) {
size_t bytes = EmptyBlockSize + capacity;
Block* block = static_cast<Block*>(_allocator.allocate(bytes));
if (block == NULL) return false;
block->capacity = capacity;
block->size = 0;
block->next = _head;
_head = block;
return true;
}
TAllocator _allocator;
Block* _head;
size_t _nextBlockCapacity;
};
}
#if defined(__clang__)
#pragma clang diagnostic pop
#elif defined(__GNUC__)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic pop
#endif
#endif
// Implements a JsonBuffer with dynamic memory allocation.
// You are strongly encouraged to consider using StaticJsonBuffer which is much
// more suitable for embedded systems.
typedef Internals::DynamicJsonBufferBase<Internals::DefaultAllocator>
DynamicJsonBuffer;
}

View File

@ -0,0 +1,227 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Data/JsonBufferAllocated.hpp"
#include "Data/List.hpp"
#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"
#include "TypeTraits/IsFloatingPoint.hpp"
#include "TypeTraits/IsSame.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 {
// Forward declarations
class JsonObject;
class JsonBuffer;
namespace Internals {
class JsonArraySubscript;
}
// An array of JsonVariant.
//
// The constructor is private, instances must be created via
// JsonBuffer::createArray() or JsonBuffer::parseArray().
// A JsonArray can be serialized to a JSON string via JsonArray::printTo().
// It can also be deserialized from a JSON string via JsonBuffer::parseArray().
class JsonArray : public Internals::JsonPrintable<JsonArray>,
public Internals::ReferenceType,
public Internals::NonCopyable,
public Internals::List<JsonVariant>,
public Internals::JsonBufferAllocated {
public:
// Create an empty JsonArray attached to the specified JsonBuffer.
// You should not call this constructor directly.
// Instead, use JsonBuffer::createArray() or JsonBuffer::parseArray().
explicit JsonArray(JsonBuffer *buffer) throw()
: Internals::List<JsonVariant>(buffer) {}
// Gets the value at the specified index
const Internals::JsonArraySubscript operator[](size_t index) const;
// Gets or sets the value at specified index
Internals::JsonArraySubscript operator[](size_t index);
// Adds the specified value at the end of the array.
//
// bool add(TValue);
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
// std::string, String, JsonArray, JsonObject
template <typename T>
bool add(const T &value) {
return add_impl<const T &>(value);
}
//
// bool add(TValue);
// TValue = char*, const char*, const FlashStringHelper*
template <typename T>
bool add(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.
//
// bool add(size_t index, const TValue&);
// 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);
// TValue = char*, const char*, const FlashStringHelper*
template <typename T>
bool set(size_t index, T *value) {
return set_impl<T *>(index, value);
}
//
// bool set(size_t index, TValue value, uint8_t decimals);
// TValue = float, double
template <typename T>
typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type
set(size_t index, T value, uint8_t decimals) {
return set_impl<const JsonVariant &>(index, JsonVariant(value, decimals));
}
// Gets the value at the specified index.
template <typename T>
typename Internals::JsonVariantAs<T>::type get(size_t index) const {
const_iterator it = begin() += index;
return it != end() ? it->as<T>() : Internals::JsonVariantDefault<T>::get();
}
// Check the type of the value at specified index.
template <typename T>
bool is(size_t index) const {
const_iterator it = begin() += index;
return it != end() ? it->is<T>() : false;
}
// Creates a JsonArray and adds a reference at the end of the array.
// It's a shortcut for JsonBuffer::createArray() and JsonArray::add()
JsonArray &createNestedArray();
// Creates a JsonObject and adds a reference at the end of the array.
// It's a shortcut for JsonBuffer::createObject() and JsonArray::add()
JsonObject &createNestedObject();
// Removes element at specified index.
void remove(size_t index) {
remove(begin() += index);
}
using Internals::List<JsonVariant>::remove;
// Returns a reference an invalid JsonArray.
// This object is meant to replace a NULL pointer.
// This is used when memory allocation or JSON parsing fail.
static JsonArray &invalid() {
static JsonArray instance(NULL);
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>
bool copyFrom(T *array, size_t len) {
bool ok = true;
for (size_t i = 0; i < len; i++) {
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 {
size_t i = 0;
for (const_iterator it = begin(); it != end() && i < N1; ++it) {
it->as<JsonArray>().copyTo(array[i++]);
}
}
#if ARDUINOJSON_ENABLE_DEPRECATED
DEPRECATED("use remove() instead")
FORCE_INLINE void removeAt(size_t index) {
return remove(index);
}
#endif
private:
template <typename TValueRef>
bool set_impl(size_t index, TValueRef value) {
iterator it = begin() += index;
if (it == end()) return false;
return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value);
}
template <typename TValueRef>
bool add_impl(TValueRef value) {
iterator it = Internals::List<JsonVariant>::add();
if (it == end()) return false;
return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value);
}
};
namespace Internals {
template <>
struct JsonVariantDefault<JsonArray> {
static JsonArray &get() {
return JsonArray::invalid();
}
};
}
}

View File

@ -0,0 +1,26 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "JsonArray.hpp"
#include "JsonArraySubscript.hpp"
#include "JsonObject.hpp"
namespace ArduinoJson {
inline JsonArray &JsonArray::createNestedArray() {
if (!_buffer) return JsonArray::invalid();
JsonArray &array = _buffer->createArray();
add(array);
return array;
}
inline JsonObject &JsonArray::createNestedObject() {
if (!_buffer) return JsonObject::invalid();
JsonObject &object = _buffer->createObject();
add(object);
return object;
}
}

View File

@ -0,0 +1,122 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Configuration.hpp"
#include "JsonVariantBase.hpp"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4522)
#endif
namespace ArduinoJson {
namespace Internals {
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
public:
FORCE_INLINE JsonArraySubscript(JsonArray& array, size_t index)
: _array(array), _index(index) {}
FORCE_INLINE JsonArraySubscript& operator=(const JsonArraySubscript& src) {
_array.set(_index, src);
return *this;
}
// Replaces the value
//
// operator=(const TValue&)
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
// std::string, String, JsonArray, JsonObject
template <typename T>
FORCE_INLINE JsonArraySubscript& operator=(const T& src) {
_array.set(_index, src);
return *this;
}
//
// operator=(TValue)
// TValue = char*, const char*, const FlashStringHelper*
template <typename T>
FORCE_INLINE JsonArraySubscript& operator=(T* src) {
_array.set(_index, src);
return *this;
}
FORCE_INLINE bool success() const {
return _index < _array.size();
}
template <typename T>
FORCE_INLINE typename JsonVariantAs<T>::type as() const {
return _array.get<T>(_index);
}
template <typename T>
FORCE_INLINE bool is() const {
return _array.is<T>(_index);
}
// Replaces the value
//
// bool set(const TValue&)
// TValue = bool, long, int, short, float, double, RawJson, JsonVariant,
// std::string, String, JsonArray, JsonObject
template <typename TValue>
FORCE_INLINE bool set(const TValue& value) {
return _array.set(_index, value);
}
//
// bool set(TValue)
// TValue = char*, const char*, const FlashStringHelper*
template <typename TValue>
FORCE_INLINE bool set(TValue* value) {
return _array.set(_index, value);
}
//
// bool set(TValue, uint8_t decimals);
// TValue = float, double
template <typename TValue>
DEPRECATED("Second argument is not supported anymore")
FORCE_INLINE bool set(const TValue& value, uint8_t) {
return _array.set(_index, value);
}
private:
JsonArray& _array;
const size_t _index;
};
template <typename TImpl>
inline JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
size_t index) {
return impl()->template as<JsonArray>()[index];
}
template <typename TImpl>
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
}
inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) {
return Internals::JsonArraySubscript(*this, index);
}
inline const Internals::JsonArraySubscript JsonArray::operator[](
size_t index) const {
return Internals::JsonArraySubscript(*const_cast<JsonArray*>(this), index);
}
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif

View File

@ -0,0 +1,78 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include <stddef.h> // for size_t
#include <stdint.h> // for uint8_t
#include <string.h>
#include "Data/NonCopyable.hpp"
#include "JsonVariant.hpp"
#include "TypeTraits/EnableIf.hpp"
#include "TypeTraits/IsArray.hpp"
namespace ArduinoJson {
class JsonArray;
class JsonObject;
// Entry point for using the library.
//
// Handle the memory management (done in derived classes) and calls the parser.
// This abstract class is implemented by StaticJsonBuffer which implements a
// fixed memory allocation.
class JsonBuffer : Internals::NonCopyable {
public:
// Allocates an empty JsonArray.
//
// Returns a reference to the new JsonArray or JsonArray::invalid() if the
// allocation fails.
JsonArray &createArray();
// Allocates an empty JsonObject.
//
// Returns a reference to the new JsonObject or JsonObject::invalid() if the
// allocation fails.
JsonObject &createObject();
// Duplicates a string
//
// const char* strdup(TValue);
// TValue = const std::string&, const String&,
template <typename TString>
DEPRECATED("char* are duplicated, you don't need strdup() anymore")
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
const char *>::type strdup(const TString &src) {
return Internals::StringTraits<TString>::duplicate(src, this);
}
//
// const char* strdup(TValue);
// TValue = char*, const char*, const FlashStringHelper*
template <typename TString>
DEPRECATED("char* are duplicated, you don't need strdup() anymore")
const char *strdup(TString *src) {
return Internals::StringTraits<TString *>::duplicate(src, this);
}
// Allocates n bytes in the JsonBuffer.
// Return a pointer to the allocated memory or NULL if allocation fails.
virtual void *alloc(size_t size) = 0;
protected:
// CAUTION: NO VIRTUAL DESTRUCTOR!
// If we add a virtual constructor the Arduino compiler will add malloc()
// and free() to the binary, adding 706 useless bytes.
~JsonBuffer() {}
// Preserve aligment if necessary
static FORCE_INLINE size_t round_size_up(size_t bytes) {
#if ARDUINOJSON_ENABLE_ALIGNMENT
const size_t x = sizeof(void *) - 1;
return (bytes + x) & ~x;
#else
return bytes;
#endif
}
};
}

View File

@ -0,0 +1,127 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Deserialization/JsonParser.hpp"
namespace ArduinoJson {
namespace Internals {
template <typename TDerived>
class JsonBufferBase : public JsonBuffer {
public:
// Allocates and populate a JsonArray from a JSON string.
//
// The First argument is a pointer to the JSON string, the memory must be
// writable
// because the parser will insert null-terminators and replace escaped chars.
//
// The second argument set the nesting limit
//
// Returns a reference to the new JsonObject or JsonObject::invalid() if the
// allocation fails.
// With this overload, the JsonBuffer will make a copy of the string
//
// JsonArray& parseArray(TString);
// TString = const std::string&, const String&
template <typename TString>
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
JsonArray &>::type
parseArray(const TString &json,
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseArray();
}
//
// JsonArray& parseArray(TString);
// TString = const char*, const char[N], const FlashStringHelper*
template <typename TString>
JsonArray &parseArray(
TString *json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseArray();
}
//
// JsonArray& parseArray(TString);
// TString = std::istream&, Stream&
template <typename TString>
JsonArray &parseArray(
TString &json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseArray();
}
// Allocates and populate a JsonObject from a JSON string.
//
// The First argument is a pointer to the JSON string, the memory must be
// writable
// because the parser will insert null-terminators and replace escaped chars.
//
// The second argument set the nesting limit
//
// Returns a reference to the new JsonObject or JsonObject::invalid() if the
// allocation fails.
//
// JsonObject& parseObject(TString);
// TString = const std::string&, const String&
template <typename TString>
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
JsonObject &>::type
parseObject(const TString &json,
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseObject();
}
//
// JsonObject& parseObject(TString);
// TString = const char*, const char[N], const FlashStringHelper*
template <typename TString>
JsonObject &parseObject(
TString *json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseObject();
}
//
// JsonObject& parseObject(TString);
// TString = std::istream&, Stream&
template <typename TString>
JsonObject &parseObject(
TString &json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseObject();
}
// Generalized version of parseArray() and parseObject(), also works for
// integral types.
//
// JsonVariant parse(TString);
// TString = const std::string&, const String&
template <typename TString>
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
JsonVariant>::type
parse(const TString &json,
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseVariant();
}
//
// JsonVariant parse(TString);
// TString = const char*, const char[N], const FlashStringHelper*
template <typename TString>
JsonVariant parse(TString *json,
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseVariant();
}
//
// JsonVariant parse(TString);
// TString = std::istream&, Stream&
template <typename TString>
JsonVariant parse(TString &json,
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
return Internals::makeParser(that(), json, nestingLimit).parseVariant();
}
protected:
~JsonBufferBase() {}
private:
TDerived *that() {
return static_cast<TDerived *>(this);
}
};
}
}

View File

@ -0,0 +1,17 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Deserialization/JsonParser.hpp"
inline ArduinoJson::JsonArray &ArduinoJson::JsonBuffer::createArray() {
JsonArray *ptr = new (this) JsonArray(this);
return ptr ? *ptr : JsonArray::invalid();
}
inline ArduinoJson::JsonObject &ArduinoJson::JsonBuffer::createObject() {
JsonObject *ptr = new (this) JsonObject(this);
return ptr ? *ptr : JsonObject::invalid();
}

View File

@ -0,0 +1,322 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Data/JsonBufferAllocated.hpp"
#include "Data/List.hpp"
#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"
#include "TypeTraits/IsFloatingPoint.hpp"
#include "TypeTraits/IsSame.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 {
// Forward declarations
class JsonArray;
class JsonBuffer;
namespace Internals {
template <typename>
class JsonObjectSubscript;
}
// A dictionary of JsonVariant indexed by string (char*)
//
// The constructor is private, instances must be created via
// JsonBuffer::createObject() or JsonBuffer::parseObject().
// A JsonObject can be serialized to a JSON string via JsonObject::printTo().
// It can also be deserialized from a JSON string via JsonBuffer::parseObject().
class JsonObject : public Internals::JsonPrintable<JsonObject>,
public Internals::ReferenceType,
public Internals::NonCopyable,
public Internals::List<JsonPair>,
public Internals::JsonBufferAllocated {
public:
// Create an empty JsonArray attached to the specified JsonBuffer.
// You should not use this constructor directly.
// Instead, use JsonBuffer::createObject() or JsonBuffer.parseObject().
explicit JsonObject(JsonBuffer* buffer) throw()
: Internals::List<JsonPair>(buffer) {}
// Gets or sets the value associated with the specified key.
//
// JsonObjectSubscript operator[](TKey)
// TKey = const std::string&, const String&
template <typename TString>
Internals::JsonObjectSubscript<const TString&> operator[](
const TString& key) {
return Internals::JsonObjectSubscript<const TString&>(*this, key);
}
//
// 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 JsonObjectSubscript operator[](TKey) const;
// 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.
//
// 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);
}
//
// bool set(TKey, TValue);
// 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);
}
//
// bool set(TKey, TValue, uint8_t decimals);
// TKey = const std::string&, const String&
// TValue = float, double
template <typename TValue, typename TString>
DEPRECATED("Second argument is not supported anymore")
typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
bool>::type
set(const TString& key, TValue value, uint8_t) {
return set_impl<const TString&, const JsonVariant&>(key,
JsonVariant(value));
}
//
// bool set(TKey, TValue, uint8_t decimals);
// TKey = char*, const char*, const FlashStringHelper*
// TValue = float, double
template <typename TValue, typename TString>
DEPRECATED("Second argument is not supported anymore")
typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
bool>::type
set(TString* key, TValue value, uint8_t) {
return set_impl<TString*, const JsonVariant&>(key, JsonVariant(value));
}
// Gets the value associated with the specified key.
//
// TValue get<TValue>(TKey) const;
// TKey = const std::string&, const String&
// TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString>
typename Internals::JsonVariantAs<TValue>::type get(
const TString& key) const {
return get_impl<const TString&, TValue>(key);
}
//
// TValue get<TValue>(TKey) const;
// TKey = char*, const char*, const FlashStringHelper*
// TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString>
typename Internals::JsonVariantAs<TValue>::type get(TString* key) const {
return get_impl<TString*, TValue>(key);
}
// Checks the type of the value associated with the specified key.
//
//
// bool is<TValue>(TKey) const;
// TKey = const std::string&, const String&
// TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString>
bool is(const TString& key) const {
return is_impl<const TString&, TValue>(key);
}
//
// bool is<TValue>(TKey) const;
// TKey = char*, const char*, const FlashStringHelper*
// TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString>
bool is(TString* key) const {
return is_impl<TString*, TValue>(key);
}
// Creates and adds a JsonArray.
//
// JsonArray& createNestedArray(TKey);
// TKey = const std::string&, const String&
template <typename TString>
JsonArray& createNestedArray(const TString& key) {
return createNestedArray_impl<const TString&>(key);
}
// JsonArray& createNestedArray(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString>
JsonArray& createNestedArray(TString* key) {
return createNestedArray_impl<TString*>(key);
}
// Creates and adds a JsonObject.
//
// JsonObject& createNestedObject(TKey);
// TKey = const std::string&, const String&
template <typename TString>
JsonObject& createNestedObject(const TString& key) {
return createNestedObject_impl<const TString&>(key);
}
//
// JsonObject& createNestedObject(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString>
JsonObject& createNestedObject(TString* key) {
return createNestedObject_impl<TString*>(key);
}
// Tells weither the specified key is present and associated with a value.
//
// 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);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString>
bool containsKey(TString* key) const {
return findKey<TString*>(key) != end();
}
// Removes the specified key and the associated value.
//
// void remove(TKey);
// TKey = const std::string&, const String&
template <typename TString>
void remove(const TString& key) {
remove(findKey<const TString&>(key));
}
//
// void remove(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString>
void remove(TString* key) {
remove(findKey<TString*>(key));
}
//
// void remove(iterator)
using Internals::List<JsonPair>::remove;
// Returns a reference an invalid JsonObject.
// This object is meant to replace a NULL pointer.
// This is used when memory allocation or JSON parsing fail.
static JsonObject& invalid() {
static JsonObject instance(NULL);
return instance;
}
private:
// Returns the list node that matches the specified key.
template <typename TStringRef>
iterator findKey(TStringRef key) {
iterator it;
for (it = begin(); it != end(); ++it) {
if (Internals::StringTraits<TStringRef>::equals(key, it->key)) break;
}
return it;
}
template <typename TStringRef>
const_iterator findKey(TStringRef key) const {
return const_cast<JsonObject*>(this)->findKey<TStringRef>(key);
}
template <typename TStringRef, typename TValue>
typename Internals::JsonVariantAs<TValue>::type get_impl(
TStringRef key) const {
const_iterator it = findKey<TStringRef>(key);
return it != end() ? it->value.as<TValue>()
: Internals::JsonVariantDefault<TValue>::get();
}
template <typename TStringRef, typename TValueRef>
bool set_impl(TStringRef key, TValueRef value) {
iterator it = findKey<TStringRef>(key);
if (it == end()) {
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;
}
return Internals::ValueSaver<TValueRef>::save(_buffer, it->value, value);
}
template <typename TStringRef, typename TValue>
bool is_impl(TStringRef key) const {
const_iterator it = findKey<TStringRef>(key);
return it != end() ? it->value.is<TValue>() : false;
}
template <typename TStringRef>
JsonArray& createNestedArray_impl(TStringRef key);
template <typename TStringRef>
JsonObject& createNestedObject_impl(TStringRef key);
};
namespace Internals {
template <>
struct JsonVariantDefault<JsonObject> {
static JsonObject& get() {
return JsonObject::invalid();
}
};
}
}

View File

@ -0,0 +1,28 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "JsonArray.hpp"
#include "JsonObject.hpp"
#include "JsonObjectSubscript.hpp"
namespace ArduinoJson {
template <typename TStringRef>
inline JsonArray &JsonObject::createNestedArray_impl(TStringRef key) {
if (!_buffer) return JsonArray::invalid();
JsonArray &array = _buffer->createArray();
set(key, array);
return array;
}
template <typename TStringRef>
inline JsonObject &JsonObject::createNestedObject_impl(TStringRef key) {
if (!_buffer) return JsonObject::invalid();
JsonObject &object = _buffer->createObject();
set(key, object);
return object;
}
}

View File

@ -0,0 +1,110 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Configuration.hpp"
#include "JsonVariantBase.hpp"
#include "TypeTraits/EnableIf.hpp"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4522)
#endif
namespace ArduinoJson {
namespace Internals {
template <typename TStringRef>
class JsonObjectSubscript
: public JsonVariantBase<JsonObjectSubscript<TStringRef> > {
typedef JsonObjectSubscript<TStringRef> this_type;
public:
FORCE_INLINE JsonObjectSubscript(JsonObject& object, TStringRef key)
: _object(object), _key(key) {}
FORCE_INLINE this_type& operator=(const this_type& src) {
_object.set(_key, src);
return *this;
}
// Set the specified value
//
// operator=(const TValue&);
// TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject
template <typename TValue>
FORCE_INLINE typename EnableIf<!IsArray<TValue>::value, this_type&>::type
operator=(const TValue& src) {
_object.set(_key, src);
return *this;
}
//
// operator=(TValue);
// TValue = char*, const char*, const FlashStringHelper*
template <typename TValue>
FORCE_INLINE this_type& operator=(TValue* src) {
_object.set(_key, src);
return *this;
}
FORCE_INLINE bool success() const {
return _object.containsKey(_key);
}
template <typename TValue>
FORCE_INLINE typename JsonVariantAs<TValue>::type as() const {
return _object.get<TValue>(_key);
}
template <typename TValue>
FORCE_INLINE bool is() const {
return _object.is<TValue>(_key);
}
// Sets the specified value.
//
// bool set(const TValue&);
// TValue = bool, char, long, int, short, float, double, RawJson, JsonVariant,
// std::string, String, JsonArray, JsonObject
template <typename TValue>
FORCE_INLINE typename EnableIf<!IsArray<TValue>::value, bool>::type set(
const TValue& value) {
return _object.set(_key, value);
}
//
// bool set(TValue);
// TValue = char*, const char, const FlashStringHelper*
template <typename TValue>
FORCE_INLINE bool set(const TValue* value) {
return _object.set(_key, value);
}
//
// bool set(TValue, uint8_t decimals);
// TValue = float, double
template <typename TValue>
DEPRECATED("Second argument is not supported anymore")
FORCE_INLINE bool set(const TValue& value, uint8_t) {
return _object.set(_key, value);
}
private:
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
}
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif

View File

@ -0,0 +1,16 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "JsonVariant.hpp"
namespace ArduinoJson {
// A key value pair for JsonObject.
struct JsonPair {
const char* key;
JsonVariant value;
};
}

View File

@ -0,0 +1,355 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include <stddef.h>
#include <stdint.h> // for uint8_t
#include "Data/JsonVariantContent.hpp"
#include "Data/JsonVariantDefault.hpp"
#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"
#include "TypeTraits/IsIntegral.hpp"
#include "TypeTraits/IsSame.hpp"
#include "TypeTraits/IsSignedIntegral.hpp"
#include "TypeTraits/IsUnsignedIntegral.hpp"
#include "TypeTraits/RemoveConst.hpp"
#include "TypeTraits/RemoveReference.hpp"
namespace ArduinoJson {
// Forward declarations.
class JsonArray;
class JsonObject;
// A variant that can be a any value serializable to a JSON value.
//
// It can be set to:
// - a boolean
// - a char, short, int or a long (signed or unsigned)
// - a string (const char*)
// - a reference to a JsonArray or JsonObject
class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
template <typename Print>
friend class Internals::JsonSerializer;
public:
// Creates an uninitialized JsonVariant
JsonVariant() : _type(Internals::JSON_UNDEFINED) {}
// Create a JsonVariant containing a boolean value.
// It will be serialized as "true" or "false" in JSON.
JsonVariant(bool value) {
using namespace Internals;
_type = JSON_BOOLEAN;
_content.asInteger = static_cast<JsonUInt>(value);
}
// Create a JsonVariant containing a floating point value.
// JsonVariant(double value);
// JsonVariant(float value);
template <typename T>
JsonVariant(T value, typename Internals::EnableIf<
Internals::IsFloatingPoint<T>::value>::type * = 0) {
using namespace Internals;
_type = JSON_FLOAT;
_content.asFloat = static_cast<JsonFloat>(value);
}
template <typename T>
DEPRECATED("Second argument is not supported anymore")
JsonVariant(T value, uint8_t,
typename Internals::EnableIf<
Internals::IsFloatingPoint<T>::value>::type * = 0) {
using namespace Internals;
_type = JSON_FLOAT;
_content.asFloat = static_cast<JsonFloat>(value);
}
// Create a JsonVariant containing an integer value.
// JsonVariant(char)
// JsonVariant(signed short)
// JsonVariant(signed int)
// JsonVariant(signed long)
// JsonVariant(signed char)
template <typename T>
JsonVariant(
T value,
typename Internals::EnableIf<Internals::IsSignedIntegral<T>::value ||
Internals::IsSame<T, char>::value>::type * =
0) {
using namespace Internals;
if (value >= 0) {
_type = JSON_POSITIVE_INTEGER;
_content.asInteger = static_cast<JsonUInt>(value);
} else {
_type = JSON_NEGATIVE_INTEGER;
_content.asInteger = static_cast<JsonUInt>(-value);
}
}
// JsonVariant(unsigned short)
// JsonVariant(unsigned int)
// JsonVariant(unsigned long)
template <typename T>
JsonVariant(T value,
typename Internals::EnableIf<
Internals::IsUnsignedIntegral<T>::value>::type * = 0) {
using namespace Internals;
_type = JSON_POSITIVE_INTEGER;
_content.asInteger = static_cast<JsonUInt>(value);
}
// Create a JsonVariant containing a string.
// JsonVariant(const char*);
// JsonVariant(const signed char*);
// JsonVariant(const unsigned char*);
template <typename TChar>
JsonVariant(
const TChar *value,
typename Internals::EnableIf<Internals::IsChar<TChar>::value>::type * =
0) {
_type = Internals::JSON_STRING;
_content.asString = reinterpret_cast<const char *>(value);
}
// Create a JsonVariant containing an unparsed string
JsonVariant(Internals::RawJsonString<const char *> value) {
_type = Internals::JSON_UNPARSED;
_content.asString = value;
}
// Create a JsonVariant containing a reference to an array.
// CAUTION: we are lying about constness, because the array can be modified if
// 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);
// Get the variant as the specified type.
//
// char as<char>() const;
// signed char as<signed char>() const;
// signed short as<signed short>() const;
// signed int as<signed int>() const;
// signed long as<signed long>() const;
// unsigned char as<unsigned char>() const;
// unsigned short as<unsigned short>() const;
// unsigned int as<unsigned int>() const;
// unsigned long as<unsigned long>() const;
template <typename T>
const typename Internals::EnableIf<Internals::IsIntegral<T>::value, T>::type
as() const {
return variantAsInteger<T>();
}
// bool as<bool>() const
template <typename T>
const typename Internals::EnableIf<Internals::IsSame<T, bool>::value, T>::type
as() const {
return variantAsInteger<int>() != 0;
}
//
// double as<double>() const;
// float as<float>() const;
template <typename T>
const typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value,
T>::type
as() const {
return variantAsFloat<T>();
}
//
// const char* as<const char*>() const;
// const char* as<char*>() const;
template <typename T>
typename Internals::EnableIf<Internals::IsSame<T, const char *>::value ||
Internals::IsSame<T, char *>::value,
const char *>::type
as() const {
return variantAsString();
}
//
// std::string as<std::string>() const;
// String as<String>() const;
template <typename T>
typename Internals::EnableIf<Internals::StringTraits<T>::has_append, T>::type
as() const {
const char *cstr = variantAsString();
if (cstr) return T(cstr);
T s;
printTo(s);
return s;
}
//
// JsonArray& as<JsonArray> const;
// JsonArray& as<JsonArray&> const;
template <typename T>
typename Internals::EnableIf<
Internals::IsSame<typename Internals::RemoveReference<T>::type,
JsonArray>::value,
JsonArray &>::type
as() const {
return variantAsArray();
}
//
// const JsonArray& as<const JsonArray&> const;
template <typename T>
typename Internals::EnableIf<
Internals::IsSame<typename Internals::RemoveReference<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::EnableIf<
Internals::IsSame<typename Internals::RemoveReference<T>::type,
JsonObject>::value,
JsonObject &>::type
as() const {
return variantAsObject();
}
//
// JsonObject& as<const JsonObject> const;
// JsonObject& as<const JsonObject&> const;
template <typename T>
typename Internals::EnableIf<
Internals::IsSame<typename Internals::RemoveReference<T>::type,
const JsonObject>::value,
const JsonObject &>::type
as() const {
return variantAsObject();
}
//
// JsonVariant as<JsonVariant> const;
template <typename T>
typename Internals::EnableIf<Internals::IsSame<T, JsonVariant>::value,
T>::type
as() const {
return *this;
}
// Tells weither the variant has the specified type.
// Returns true if the variant has type type T, false otherwise.
//
// bool is<char>() const;
// bool is<signed char>() const;
// bool is<signed short>() const;
// bool is<signed int>() const;
// bool is<signed long>() const;
// bool is<unsigned char>() const;
// bool is<unsigned short>() const;
// bool is<unsigned int>() const;
// bool is<unsigned long>() const;
template <typename T>
typename Internals::EnableIf<Internals::IsIntegral<T>::value, bool>::type is()
const {
return variantIsInteger();
}
//
// bool is<double>() const;
// bool is<float>() const;
template <typename T>
typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type
is() const {
return variantIsFloat();
}
//
// bool is<bool>() const
template <typename T>
typename Internals::EnableIf<Internals::IsSame<T, bool>::value, bool>::type
is() const {
return variantIsBoolean();
}
//
// bool is<const char*>() const;
// bool is<char*>() const;
template <typename T>
typename Internals::EnableIf<Internals::IsSame<T, const char *>::value ||
Internals::IsSame<T, char *>::value,
bool>::type
is() const {
return variantIsString();
}
//
// bool is<JsonArray> const;
// bool is<JsonArray&> const;
// bool is<const JsonArray&> const;
template <typename T>
typename Internals::EnableIf<
Internals::IsSame<typename Internals::RemoveConst<
typename Internals::RemoveReference<T>::type>::type,
JsonArray>::value,
bool>::type
is() const {
return variantIsArray();
}
//
// bool is<JsonObject> const;
// bool is<JsonObject&> const;
// bool is<const JsonObject&> const;
template <typename T>
typename Internals::EnableIf<
Internals::IsSame<typename Internals::RemoveConst<
typename Internals::RemoveReference<T>::type>::type,
JsonObject>::value,
bool>::type
is() const {
return variantIsObject();
}
// Returns true if the variant has a value
bool success() const {
return _type != Internals::JSON_UNDEFINED;
}
private:
JsonArray &variantAsArray() const;
JsonObject &variantAsObject() const;
const char *variantAsString() const;
template <typename T>
T variantAsFloat() const;
template <typename T>
T variantAsInteger() const;
bool variantIsBoolean() const;
bool variantIsFloat() const;
bool variantIsInteger() const;
bool variantIsArray() const {
return _type == Internals::JSON_ARRAY;
}
bool variantIsObject() const {
return _type == Internals::JSON_OBJECT;
}
bool variantIsString() const {
return _type == Internals::JSON_STRING ||
(_type == Internals::JSON_UNPARSED && _content.asString &&
!strcmp("null", _content.asString));
}
// The current type of the variant
Internals::JsonVariantType _type;
// The various alternatives for the value of the variant.
Internals::JsonVariantContent _content;
};
DEPRECATED("Decimal places are ignored, use the float value instead")
inline JsonVariant float_with_n_digits(float value, uint8_t) {
return JsonVariant(value);
}
DEPRECATED("Decimal places are ignored, use the double value instead")
inline JsonVariant double_with_n_digits(double value, uint8_t) {
return JsonVariant(value);
}
}

View File

@ -0,0 +1,24 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "JsonVariantCasts.hpp"
#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>,
public JsonVariantComparisons<TImpl>,
public JsonVariantOr<TImpl>,
public JsonVariantSubscripts<TImpl>,
public JsonVariantTag {};
}
}

View File

@ -0,0 +1,59 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Data/JsonVariantAs.hpp"
#include "Polyfills/attributes.hpp"
namespace ArduinoJson {
namespace Internals {
template <typename TImpl>
class JsonVariantCasts {
public:
#if ARDUINOJSON_ENABLE_DEPRECATED
DEPRECATED("use as<JsonArray>() instead")
FORCE_INLINE JsonArray &asArray() const {
return impl()->template as<JsonArray>();
}
DEPRECATED("use as<JsonObject>() instead")
FORCE_INLINE JsonObject &asObject() const {
return impl()->template as<JsonObject>();
}
DEPRECATED("use as<char*>() instead")
FORCE_INLINE const char *asString() const {
return impl()->template as<const char *>();
}
#endif
// 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>
FORCE_INLINE operator T() const {
return impl()->template as<T>();
}
private:
const TImpl *impl() const {
return static_cast<const TImpl *>(this);
}
};
}
}

View File

@ -0,0 +1,138 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "StringTraits/StringTraits.hpp"
#include "TypeTraits/EnableIf.hpp"
#include "TypeTraits/IsVariant.hpp"
namespace ArduinoJson {
namespace Internals {
template <typename TImpl>
class JsonVariantComparisons {
public:
template <typename TComparand>
friend bool operator==(const JsonVariantComparisons &variant,
TComparand comparand) {
return variant.equals(comparand);
}
template <typename TComparand>
friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
operator==(TComparand comparand, const JsonVariantComparisons &variant) {
return variant.equals(comparand);
}
template <typename TComparand>
friend bool operator!=(const JsonVariantComparisons &variant,
TComparand comparand) {
return !variant.equals(comparand);
}
template <typename TComparand>
friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
operator!=(TComparand comparand, const JsonVariantComparisons &variant) {
return !variant.equals(comparand);
}
template <typename TComparand>
friend bool operator<=(const JsonVariantComparisons &left, TComparand right) {
return left.as<TComparand>() <= right;
}
template <typename TComparand>
friend bool operator<=(TComparand comparand,
const JsonVariantComparisons &variant) {
return comparand <= variant.as<TComparand>();
}
template <typename TComparand>
friend bool operator>=(const JsonVariantComparisons &variant,
TComparand comparand) {
return variant.as<TComparand>() >= comparand;
}
template <typename TComparand>
friend bool operator>=(TComparand comparand,
const JsonVariantComparisons &variant) {
return comparand >= variant.as<TComparand>();
}
template <typename TComparand>
friend bool operator<(const JsonVariantComparisons &varian,
TComparand comparand) {
return varian.as<TComparand>() < comparand;
}
template <typename TComparand>
friend bool operator<(TComparand comparand,
const JsonVariantComparisons &variant) {
return comparand < variant.as<TComparand>();
}
template <typename TComparand>
friend bool operator>(const JsonVariantComparisons &variant,
TComparand comparand) {
return variant.as<TComparand>() > comparand;
}
template <typename TComparand>
friend bool operator>(TComparand comparand,
const JsonVariantComparisons &variant) {
return comparand > variant.as<TComparand>();
}
private:
const TImpl *impl() const {
return static_cast<const TImpl *>(this);
}
template <typename T>
const typename JsonVariantAs<T>::type as() const {
return impl()->template as<T>();
}
template <typename T>
bool is() const {
return impl()->template is<T>();
}
template <typename TString>
typename EnableIf<StringTraits<TString>::has_equals, bool>::type equals(
const TString &comparand) const {
const char *value = as<const char *>();
return StringTraits<TString>::equals(comparand, value);
}
template <typename TComparand>
typename EnableIf<!IsVariant<TComparand>::value &&
!StringTraits<TComparand>::has_equals,
bool>::type
equals(const TComparand &comparand) const {
return as<TComparand>() == comparand;
}
template <typename TVariant2>
bool equals(const JsonVariantComparisons<TVariant2> &right) const {
using namespace Internals;
if (is<bool>() && right.template is<bool>())
return as<bool>() == right.template as<bool>();
if (is<JsonInteger>() && right.template is<JsonInteger>())
return as<JsonInteger>() == right.template as<JsonInteger>();
if (is<JsonFloat>() && right.template is<JsonFloat>())
return as<JsonFloat>() == right.template as<JsonFloat>();
if (is<JsonArray>() && right.template is<JsonArray>())
return as<JsonArray>() == right.template as<JsonArray>();
if (is<JsonObject>() && right.template is<JsonObject>())
return as<JsonObject>() == right.template as<JsonObject>();
if (is<char *>() && right.template is<char *>())
return strcmp(as<char *>(), right.template as<char *>()) == 0;
return false;
}
};
}
}

View File

@ -0,0 +1,126 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Configuration.hpp"
#include "JsonArray.hpp"
#include "JsonObject.hpp"
#include "JsonVariant.hpp"
#include "Polyfills/isFloat.hpp"
#include "Polyfills/isInteger.hpp"
#include "Polyfills/parseFloat.hpp"
#include "Polyfills/parseInteger.hpp"
#include <string.h> // for strcmp
namespace ArduinoJson {
inline JsonVariant::JsonVariant(const JsonArray &array) {
if (array.success()) {
_type = Internals::JSON_ARRAY;
_content.asArray = const_cast<JsonArray *>(&array);
} else {
_type = Internals::JSON_UNDEFINED;
}
}
inline JsonVariant::JsonVariant(const JsonObject &object) {
if (object.success()) {
_type = Internals::JSON_OBJECT;
_content.asObject = const_cast<JsonObject *>(&object);
} else {
_type = Internals::JSON_UNDEFINED;
}
}
inline JsonArray &JsonVariant::variantAsArray() const {
if (_type == Internals::JSON_ARRAY) return *_content.asArray;
return JsonArray::invalid();
}
inline JsonObject &JsonVariant::variantAsObject() const {
if (_type == Internals::JSON_OBJECT) return *_content.asObject;
return JsonObject::invalid();
}
template <typename T>
inline T JsonVariant::variantAsInteger() const {
using namespace Internals;
switch (_type) {
case JSON_UNDEFINED:
return 0;
case JSON_POSITIVE_INTEGER:
case JSON_BOOLEAN:
return T(_content.asInteger);
case JSON_NEGATIVE_INTEGER:
return T(~_content.asInteger + 1);
case JSON_STRING:
case JSON_UNPARSED:
return parseInteger<T>(_content.asString);
default:
return T(_content.asFloat);
}
}
inline const char *JsonVariant::variantAsString() const {
using namespace Internals;
if (_type == JSON_UNPARSED && _content.asString &&
!strcmp("null", _content.asString))
return NULL;
if (_type == JSON_STRING || _type == JSON_UNPARSED) return _content.asString;
return NULL;
}
template <typename T>
inline T JsonVariant::variantAsFloat() const {
using namespace Internals;
switch (_type) {
case JSON_UNDEFINED:
return 0;
case JSON_POSITIVE_INTEGER:
case JSON_BOOLEAN:
return static_cast<T>(_content.asInteger);
case JSON_NEGATIVE_INTEGER:
return -static_cast<T>(_content.asInteger);
case JSON_STRING:
case JSON_UNPARSED:
return parseFloat<T>(_content.asString);
default:
return static_cast<T>(_content.asFloat);
}
}
inline bool JsonVariant::variantIsBoolean() const {
using namespace Internals;
if (_type == JSON_BOOLEAN) return true;
if (_type != JSON_UNPARSED || _content.asString == NULL) return false;
return !strcmp(_content.asString, "true") ||
!strcmp(_content.asString, "false");
}
inline bool JsonVariant::variantIsInteger() const {
using namespace Internals;
return _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER ||
(_type == JSON_UNPARSED && isInteger(_content.asString));
}
inline bool JsonVariant::variantIsFloat() const {
using namespace Internals;
return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER ||
_type == JSON_NEGATIVE_INTEGER ||
(_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

View File

@ -0,0 +1,38 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Data/JsonVariantAs.hpp"
#include "Polyfills/attributes.hpp"
namespace ArduinoJson {
namespace Internals {
template <typename TImpl>
class JsonVariantOr {
public:
// Returns the default value if the JsonVariant is undefined of incompatible
template <typename T>
T operator|(const T &defaultValue) const {
if (impl()->template is<T>())
return impl()->template as<T>();
else
return defaultValue;
}
// Returns the default value if the JsonVariant is undefined of incompatible
// Special case for string: null is treated as undefined
const char *operator|(const char *defaultValue) const {
const char *value = impl()->template as<const char *>();
return value ? value : defaultValue;
}
private:
const TImpl *impl() const {
return static_cast<const TImpl *>(this);
}
};
}
}

View File

@ -0,0 +1,86 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "Data/JsonVariantAs.hpp"
#include "Polyfills/attributes.hpp"
#include "StringTraits/StringTraits.hpp"
#include "TypeTraits/EnableIf.hpp"
namespace ArduinoJson {
namespace Internals {
// Forward declarations.
class JsonArraySubscript;
template <typename TKey>
class JsonObjectSubscript;
template <typename TImpl>
class JsonVariantSubscripts {
public:
// Mimics an array or an object.
// Returns the size of the array or object if the variant has that type.
// Returns 0 if the variant is neither an array nor an object
size_t size() const {
return impl()->template as<JsonArray>().size() +
impl()->template as<JsonObject>().size();
}
// Mimics 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 JsonArraySubscript operator[](size_t index);
// Mimics an object.
// Returns the value associated with the specified key if the variant is
// an object.
// Return JsonVariant::invalid() if the variant is not an object.
//
// const JsonObjectSubscript operator[](TKey) const;
// TKey = const std::string&, const String&
template <typename TString>
FORCE_INLINE
typename EnableIf<StringTraits<TString>::has_equals,
const JsonObjectSubscript<const TString &> >::type
operator[](const TString &key) const {
return impl()->template as<JsonObject>()[key];
}
//
// const JsonObjectSubscript operator[](TKey) const;
// TKey = const std::string&, const String&
template <typename TString>
FORCE_INLINE typename EnableIf<StringTraits<TString>::has_equals,
JsonObjectSubscript<const TString &> >::type
operator[](const TString &key) {
return impl()->template as<JsonObject>()[key];
}
//
// JsonObjectSubscript operator[](TKey);
// TKey = const char*, const char[N], const FlashStringHelper*
template <typename TString>
FORCE_INLINE typename EnableIf<StringTraits<const TString *>::has_equals,
JsonObjectSubscript<const TString *> >::type
operator[](const TString *key) {
return impl()->template as<JsonObject>()[key];
}
//
// JsonObjectSubscript operator[](TKey);
// TKey = const char*, const char[N], const FlashStringHelper*
template <typename TString>
FORCE_INLINE
typename EnableIf<StringTraits<TString *>::has_equals,
const JsonObjectSubscript<const TString *> >::type
operator[](const TString *key) const {
return impl()->template as<JsonObject>()[key];
}
private:
const TImpl *impl() const {
return static_cast<const TImpl *>(this);
}
};
}
}

View File

@ -0,0 +1,29 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#ifdef _MSC_VER // Visual Studio
#define FORCE_INLINE // __forceinline causes C4714 when returning std::string
#define NO_INLINE __declspec(noinline)
#define DEPRECATED(msg) __declspec(deprecated(msg))
#elif defined(__GNUC__) // GCC or Clang
#define FORCE_INLINE __attribute__((always_inline))
#define NO_INLINE __attribute__((noinline))
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
#define DEPRECATED(msg) __attribute__((deprecated(msg)))
#else
#define DEPRECATED(msg) __attribute__((deprecated))
#endif
#else // Other compilers
#define FORCE_INLINE
#define NO_INLINE
#define DEPRECATED(msg)
#endif

View File

@ -0,0 +1,18 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
inline bool isdigit(char c) {
return '0' <= c && c <= '9';
}
inline bool issign(char c) {
return '-' == c || c == '+';
}
}
}

View File

@ -0,0 +1,38 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include <string.h> // for strcmp
#include "./ctype.hpp"
namespace ArduinoJson {
namespace Internals {
inline bool isFloat(const char* s) {
if (!s) return false;
if (!strcmp(s, "NaN")) return true;
if (issign(*s)) s++;
if (!strcmp(s, "Infinity")) return true;
if (*s == '\0') return false;
while (isdigit(*s)) s++;
if (*s == '.') {
s++;
while (isdigit(*s)) s++;
}
if (*s == 'e' || *s == 'E') {
s++;
if (issign(*s)) s++;
if (!isdigit(*s)) return false;
while (isdigit(*s)) s++;
}
return *s == '\0';
}
}
}

View File

@ -0,0 +1,19 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "./ctype.hpp"
namespace ArduinoJson {
namespace Internals {
inline bool isInteger(const char* s) {
if (!s) return false;
if (issign(*s)) s++;
while (isdigit(*s)) s++;
return *s == '\0';
}
}
}

View File

@ -0,0 +1,19 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
namespace ArduinoJson {
namespace Internals {
template <typename T>
bool isNaN(T x) {
return x != x;
}
template <typename T>
bool isInfinity(T x) {
return x != 0.0 && x * 2 == x;
}
}
}

Some files were not shown because too many files have changed in this diff Show More