Compare commits

...

734 Commits

Author SHA1 Message Date
f95dd7d204 Fix overflowed() 2025-02-27 13:42:05 +01:00
b529056a4a Fix tests on VS 2025-02-27 13:42:04 +01:00
ee144b89a2 Deduplicate static strings 2025-02-27 13:42:04 +01:00
08b2400592 Store static string in a dedicated pool 2025-02-27 13:42:04 +01:00
907bb43481 Use strlen() for literals too 2025-02-27 13:41:25 +01:00
7dfa163695 Update changelog 2025-02-27 13:41:25 +01:00
905176ea17 Remove JsonString third argument 2025-02-27 13:41:07 +01:00
cb1dcfa5e4 Reduce code size 2025-02-27 11:13:50 +01:00
67dd3120e6 Fix conversion from static string to number 2025-02-27 11:01:51 +01:00
9f3cf04415 Remove useless null check 2025-02-24 16:40:42 +01:00
01e49b33b7 Update copyright year 2025-02-24 15:18:26 +01:00
8f7e793f37 Set version to 7.3.0 2024-12-29 17:15:57 +01:00
254fa5712a Update the release scripts to include the breaking changes section 2024-12-29 16:38:41 +01:00
de05814294 Move public facing SFINAEs to template declarations 2024-12-23 17:44:52 +01:00
e33e78d202 Rename undocumented JsonString::isLinked() to isStatic() 2024-11-26 14:32:50 +01:00
ed5f890d28 Replace JsonString::Ownership with bool 2024-11-26 14:32:36 +01:00
8931651317 JsonString: change default ownership to Copied 2024-11-26 10:10:52 +01:00
c078957282 Remove unnecessary universal references 2024-11-25 12:25:59 +01:00
cf084ae6b4 JsonString: move adapter class in the same file 2024-11-25 12:25:59 +01:00
f02fcc96a2 JsonArray: remove redundant tests 2024-11-25 12:25:59 +01:00
594dc707cb Change string copy policy: only string literal are stored by pointer 2024-11-25 12:25:59 +01:00
5f8e3c0f0f Polyfills: test remove_cv 2024-11-25 12:25:59 +01:00
afc0a29c2c Polyfills: add decay 2024-11-25 12:25:59 +01:00
a256ec7fff RamString: use a bitfield to reduce size 2024-11-25 12:25:59 +01:00
019e8326b7 Implement JsonString from RamString 2024-11-25 11:13:39 +01:00
bee1095042 Merge all RAM string adapters 2024-11-25 10:46:35 +01:00
de59dce527 Fix typo in comments 2024-11-25 10:46:34 +01:00
57a9c50b38 Make ElementProxy and MemberProxy non-copyable 2024-11-25 10:46:21 +01:00
5e7653b36a Store adapted string in MemberProxy 2024-11-17 15:46:46 +01:00
8110058729 Fix support for NUL characters in deserializeJson() 2024-11-17 15:40:21 +01:00
7946ebe1a3 Wandbox: compile with gcc-head 2024-11-15 09:13:00 +01:00
f9fe8557f1 Set version to 7.2.1 2024-11-15 09:05:29 +01:00
e007d71b4f Fix operator[](variant) ignoring NUL characters 2024-11-14 14:56:47 +01:00
67a512a923 Clean up tests of adaptString() 2024-11-14 14:22:51 +01:00
9cf4f3871d Remove unused overload of stringCompare() and stringEquals() 2024-11-14 14:17:13 +01:00
31253dbe13 Add more tests with VLAs 2024-11-08 09:37:49 +01:00
1110d62128 Fix VLA support in JsonDocument::set() 2024-11-08 09:37:23 +01:00
c6c0649d70 Replace typedef with using 2024-10-23 15:54:08 +02:00
61ec2c4f95 Reduce boilerplate for failing build tests 2024-10-23 15:47:59 +02:00
0dd6231b3f Forbid deserializeJson(JsonArray|JsonObject, ...)
Closes #2135
2024-10-23 15:41:34 +02:00
20219d74f0 Tests: don't link FailingBuilds with catch 2024-10-23 15:04:52 +02:00
64cbaa6ff7 Remove the workaround for particle-iot/particle-cli#716
This reverts commit 1404b1ef70.
2024-09-28 09:58:48 +02:00
2512993617 Replace problematic symbol in idf_component.yml
Fixes #2131
2024-09-26 09:18:23 +02:00
48ee4a178b Use a const reference in is_convertible() 2024-09-21 09:22:12 +02:00
cd4b2b2463 Set version to 7.2.0 2024-09-18 10:48:50 +02:00
f806a42cc2 Add support for escape sequence \'
Fixes #2124
2024-09-17 10:33:47 +02:00
c1a507c158 Set ARDUINOJSON_POOL_CAPACITY from ARDUINOJSON_SLOT_ID_SIZE
This avoids the integer overflow when `ARDUINOJSON_SLOT_ID_SIZE=1` on 64-bit architectures.
2024-09-11 21:08:51 +02:00
a1809d0f31 Replace sizeof(VariantData) with sizeof(SlotData) 2024-09-10 18:26:58 +02:00
d92eee8736 Deprecate containsKey() in favor of doc["key"].is<T>()
See #2121
2024-09-06 17:32:09 +02:00
dd1d96e28f Group calls to getExtension()
This slightly reduces the code size.
2024-09-05 12:15:10 +02:00
3b64197869 MsgPackDeserializer: check extension allocation result 2024-09-04 14:34:02 +02:00
1f7a3f3174 JsonDeserializer: use float when the value has few digits 2024-09-04 14:33:14 +02:00
fd6314e132 Move some numbers tests to use_double_0.cpp 2024-09-04 14:29:19 +02:00
e4e2557b76 Move test of decomposeFloat() 2024-09-03 13:27:39 +02:00
3b6bf45b8a Serialize float with less decimal places than double 2024-09-03 11:44:35 +02:00
65ba36622c Add VariantType 2024-09-02 17:56:19 +02:00
33452c1f37 Test JsonVariant::as<T>() with extension slots 2024-08-27 16:08:47 +02:00
ee02c0d573 Test extension slot allocation failure 2024-08-27 16:08:47 +02:00
0278e94fce Set ARDUINOJSON_USE_DOUBLE to 0 by default on 8-bit architectures 2024-08-27 15:46:12 +02:00
7643dadaec WIP 2024-08-27 14:40:24 +02:00
c0bebe35f1 Improve message when user forgets third arg of serializeJson() et al.
See #1449, #1491, #1543, #1665, and #2122
2024-08-27 12:22:53 +02:00
b5bcb37657 Use enable_if_t instead of enable_if 2024-08-27 10:00:09 +02:00
b4a5b053ca Merge conf_test for linux and windows
This reverts commit 83516e1740.
2024-08-27 08:03:55 +02:00
e297932a98 Store 64-bit numbers (double and long long) in an additional slot
This change allows slots to be twices maller on 32-bit architectures.
See #1650 and #2103
2024-08-27 08:02:09 +02:00
e682337655 Release VariantData resources explicitly before setting value 2024-08-26 15:09:56 +02:00
4ada3f849c Decouple parseNumber() from VariantData 2024-08-25 16:46:55 +02:00
5dd203bca4 Rename SlotWithId to Slot 2024-08-25 15:04:39 +02:00
362201241f Make MemoryPool generic 2024-08-25 14:58:23 +02:00
2be24eded8 Rename SlotWithId::slot() and VariantWithId::data() to ptr() 2024-08-25 14:54:45 +02:00
4327f72140 Remove VariantSlot 2024-08-25 14:45:59 +02:00
f7f1b9745d Hide FreeSlot in MemoryPoolList 2024-08-25 14:39:18 +02:00
cec18177b0 Move sizeofArray() and sizeofObject() 2024-08-25 14:36:38 +02:00
f2894552f2 Rename VariantPool to MemoryPool 2024-08-25 14:36:38 +02:00
d3721cb122 Make VariantSlot a union. Include next slot id in VariantData 2024-08-24 19:20:39 +02:00
ab72bb8601 Rename flags_ to type_ 2024-08-24 11:18:21 +02:00
09c89dcacf Store object members with two slots: one for the key and one for the value 2024-08-24 10:45:51 +02:00
a2b09bfbd2 Remove unused code 2024-08-23 15:28:44 +02:00
386105be90 Allocate slot before key 2024-08-23 15:27:46 +02:00
83516e1740 Split conf_test between linux and windows 2024-08-23 15:24:45 +02:00
bf99aeedb1 Add @LArkema to the list of sponsors 💖 2024-07-02 10:27:36 +02:00
22dd4da3af Set version to 7.1.0 2024-06-27 18:20:22 +02:00
55c3b9b3a7 CI: update macOS runner to macos-13 2024-06-18 13:51:40 +02:00
d83515dcda Add DevContainer files for Clang 13 to 17 2024-06-18 13:51:40 +02:00
e34c27723a Fix build on modern compilers 2024-06-18 13:51:40 +02:00
b23ff65b99 Reduce MsgPack deserializer size 2024-06-18 13:51:33 +02:00
556785dc1e Read MsgPack's 64-bit ints even if ARDUINOJSON_USE_LONG_LONG is 0 2024-06-18 13:50:50 +02:00
e9c87858d1 Remove files.associations from vscode settings 2024-06-18 09:31:39 +02:00
208e7a3304 Fix integer overflow in MsgPackDeserializer 2024-06-11 09:47:11 +02:00
45611924f3 Tests: add user-defined literal ""_s for std::string 2024-06-07 09:35:45 +02:00
5b88b2c1f6 Update GitHub actions 2024-06-06 18:43:10 +02:00
e4f3fd8c91 Add support for MsgPack extension 2024-06-06 18:33:48 +02:00
aec642be20 Rename tests in MixedConfiguration 2024-06-06 18:26:16 +02:00
5a60c55be7 Don't add partial objects when allocation fails
Fixes #2081
2024-05-23 18:36:24 +02:00
f99b2d63f9 Make error message more readable in case of an invalid conversion 2024-05-23 14:01:30 +02:00
1db803bcd3 Add helpers for type traits, such as enable_if_t 2024-05-22 10:22:59 +02:00
04326d2655 Allow Converter<T>::toJson() to return a boolean as an optimization 2024-05-22 09:27:15 +02:00
9e0c56acc3 Replace ConverterNeedsWriteableRef with function_traits 2024-05-22 09:27:14 +02:00
60f9f7eff6 Move CollectionData::releaseSlot() to ResourceManager::freeSlot() 2024-05-17 17:10:45 +02:00
0fe202af03 CI: don't build fuzzers with Clang 11
Clang 11 fails on GitHub Actions with the following error:
ERROR: UndefinedBehaviorSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
Sanitizer CHECK failed: /build/llvm-toolchain-11-mnvtwk/llvm-toolchain-11-11.1.0/compiler-rt/lib/sanitizer_common/sanitizer_common.cpp:54 ((0 && "unable to mmap")) != (0) (0, 0)
2024-05-16 17:47:07 +02:00
c41e8cc634 Add dev container for Clang 11 2024-05-16 17:47:07 +02:00
d486157a9e CMake: fix detection of GCC 4.8 2024-05-16 17:47:07 +02:00
91aad55412 CI: set cancel-in-progress to true 2024-05-16 17:47:07 +02:00
98fca74f66 Fix undefined reference to VariantPool::usage() 2024-05-16 17:47:07 +02:00
60fb268d9a Fix UBSAN error "member call does not point to an object of type"
runtime error: member call on address XXX which does not point to an object of type 'Allocator'
XXX: note: object is of type 'SpyingAllocator'

This is due to the fact that some of the compilation units have different library settings, so a different namespace, and therefore a different `Allocator` class.
2024-05-16 17:47:07 +02:00
f1899d3049 Fix error resources_ may be used uninitialized
JsonArrayConst.hpp:29:56: error: 'array.ArduinoJson::V704HB22::JsonArrayConst::resources_' may be used uninitialized in this function [-Werror=maybe-uninitialized]
JsonObjectConst.hpp:62:56: error: 'null.ArduinoJson::V704HB22::JsonObjectConst::resources_' may be used uninitialized in this function [-Werror=maybe-uninitialized]
2024-05-16 17:47:07 +02:00
4b779a7c1d Fix wrong build flags when COVERAGE is not defined 2024-05-16 17:47:07 +02:00
5d1aa04e21 CI: add Valgrind log to step summary 2024-05-16 17:47:07 +02:00
2f6db1edb0 CI: remove step summary
CTest errors were ignored in favor or `tee`'s exit code
2024-05-16 17:47:06 +02:00
aeb30ef307 Support ElementProxy and MemberProxy in JsonDocument's constructor 2024-05-15 13:37:33 +02:00
1c5e5db071 Test JsonDocument constructor with a JsonVariantConst argument
See #2091
2024-05-15 09:30:22 +02:00
68a13117dc Allow using a JsonVariant as a key or index
Closes #2080
2024-05-14 21:06:02 +02:00
071f718473 MsgPack: test failing string allocation 2024-05-06 11:23:20 +02:00
00949f8276 Remove redundant test 2024-05-06 11:16:55 +02:00
2c670e0148 Implement MsgPackBinary using raw strings and converters 2024-05-06 11:10:02 +02:00
002b07f0c5 Reduce the size of deserializeMsgPack() 2024-05-02 20:29:00 +02:00
5f5f927693 Add tests of as<MsgPackBinary>() 2024-05-01 19:26:19 +02:00
4d074840da Optimize deserializeMsgPack() 2024-05-01 18:00:59 +02:00
82de20ee14 Make string support even more generic
Ported from 57354de831
Closes #2084
2024-05-01 14:06:30 +02:00
ece4d030a8 CI: update runner for the lint job 2024-04-29 19:38:18 +02:00
4d5c17b5f6 Remove unused #include statements 2024-04-29 18:30:29 +02:00
18a9a5b590 Add MsgPack bin8/bin16/bin32 support
Closes #2078
Closes #922
2024-04-29 16:01:10 +02:00
cd4bf33132 Fix error "pasting X and Y does not give a valid preprocessing token" 2024-04-18 14:39:05 +02:00
2cfefe22ac Add ARDUINOJSON_STRING_LENGTH_SIZE to the namespace name 2024-04-18 14:19:43 +02:00
0d43e51d48 Fix typo in "endianness"
Closes #2071
2024-03-26 13:43:07 +01:00
ef28064317 CI: merge the two "amalgamate" jobs 2024-03-18 10:54:36 +01:00
7c62cdb264 CI: update GitHub Actions 2024-03-17 21:30:42 +01:00
0ab4bdd691 CI: add a workaround for actions/runner-images#9491 2024-03-17 21:30:42 +01:00
af8c615266 Rename tests/JsonObject/copy.cpp to set.cpp 2024-03-16 14:02:56 +01:00
bd13375729 CI: add timeouts in the gcc job 2024-03-14 10:27:09 +01:00
5f8502ce9d Upgrade to lock-threads version 5+ 2024-03-14 09:51:44 +01:00
1404b1ef70 Add a workaround for particle-iot/particle-cli#716 2024-03-12 10:02:30 +01:00
36e1eecc7d Set version to 7.0.4 2024-03-12 09:40:46 +01:00
ca2f80aeaf Add links to the documentation 2024-02-21 10:48:50 +01:00
f17fc055d3 Make JSON_STRING_SIZE(N) return N+1 to fix third-party code
ThingsBoard uses this macro to compute size of char arrays ಠ_ಠ
https://github.com/thingsboard/thingsboard-client-sdk/blob/v0.12.2/src/Helper.h#L38

Closes #2054
2024-02-18 20:00:25 +01:00
04ac53d114 Remove final from JsonArray, JsonObject, and JsonVariant
`final` breaks ThingsBoard ಠ_ಠ
https://github.com/thingsboard/thingsboard-client-sdk/blob/v0.12.2/src/RPC_Response.h#L10

See #2056.
This reverts commit 483a2c9101.
2024-02-18 20:00:24 +01:00
483a2c9101 Mark JsonArray, JsonObject, and JsonVariant as final
See #2056
2024-02-18 10:52:07 +01:00
848c0cdc7e Set version to 7.0.3 2024-02-05 13:34:38 +01:00
46a807bd30 Remove unused NO_INLINE 2024-02-05 11:56:08 +01:00
cb0dc94db4 Remove most FORCE_INLINEs
I kept only the ones that had a positive impact on code size AND no negative impact on stack memory.

Fixes #2046
2024-02-05 11:48:27 +01:00
72642e3090 Fix compatibility with GCC 4.8
Closes #2045
2024-02-01 21:37:45 +01:00
c98b05e207 Dont't inline JsonSerializer::visit(const ArrayData&)
It didn't improve the code size and was inconsistent with this other functions.
2024-02-01 10:24:01 +01:00
2a87cc5839 Stop using CollectionIterator in MsgPackSerializer
This doesn't reduce code size or stack usage, but as least it's consistent with `JsonSerializer`.
2024-02-01 10:24:01 +01:00
296fe79bfd Stop using CollectionIterator in JsonSerializer
This reduces stack consumption and code size.
See  #2046
2024-02-01 10:24:00 +01:00
650d537b5d Improve error messages when using char or char*
See #2043
2024-01-26 10:34:49 +01:00
0435945a62 Set version to 7.0.2 2024-01-19 14:36:16 +01:00
844a50296f Fix link to shrinkToFit()'s documentation 2024-01-16 14:29:08 +01:00
1b143d383b Fix assertion poolIndex < count_ after JsonDocument::clear()
Fixes #2034
2024-01-16 10:10:43 +01:00
94783fdd2a Set version to 7.0.1 2024-01-10 21:14:07 +01:00
e41d5d4fa1 Shorten the library description 2024-01-10 18:11:49 +01:00
5dfa25d3dc Include the number of GitHub stars in the library description. 2024-01-10 18:11:43 +01:00
a7bfc2212c Fix volatile bool serialized as 1 or 0
Ported from 5d1d2721d1
2024-01-10 14:03:12 +01:00
315cc722e9 Add more tests for JsonVariantConst 2024-01-08 19:47:40 +01:00
ca0dda7ac1 Add more tests for JsonArrayConst 2024-01-08 19:47:40 +01:00
08cac13c43 Add more tests for JsonObjectConst 2024-01-08 19:47:36 +01:00
44d2d47863 CI: publish package to PlatformIO registry 2024-01-04 18:05:31 +01:00
3571db6290 Remove unused files in the PlatformIO package 2024-01-04 18:01:52 +01:00
cc42373367 Fix "no matching function" with JsonObjectConst::operator[]
Fixes #2019
2024-01-03 16:30:44 +01:00
9dc43d14f3 Set version to 7.0.0 2024-01-03 09:19:34 +01:00
3fa6b6e04f Fix typo in change log 2024-01-03 09:19:14 +01:00
2d47b3931d Remove legacy Arduino package from release assets 2024-01-03 09:16:19 +01:00
0e8a236583 Update copyright year 2024-01-03 08:47:06 +01:00
955815fbfa Fix function returns incomplete class type on IAR (issue #2001)
Ported from 3e1be980d9
2023-12-07 15:51:29 +01:00
4cd03fbd26 Fix no instance of overloaded function... on IAR (fixes #2001)
Ported from 6ed87029e2
2023-12-07 15:51:29 +01:00
f7dcea562f CI: always use libc++ with clang 2023-11-06 13:24:32 +01:00
4774ca3d29 Force inline ZeroTerminatedRamString::size()
Ported from 7517ecb91b
2023-11-06 09:52:17 +01:00
26b2ff4c0f Reorder StringNode's members to reduce code size 2023-10-09 15:41:20 +02:00
7e6b89d21f Use only one byte for the string length on 8-bit platforms 2023-10-09 15:21:18 +02:00
d20e64187b Use only one byte for the reference counter on 8-bit platforms 2023-10-09 14:47:47 +02:00
86e06c901f Add ARDUINOJSON_SIZEOF_POINTER 2023-10-09 14:40:18 +02:00
6fe4b9c01d Detect string length overflows 2023-10-09 14:15:55 +02:00
9b34069a3b Remove obsolete comments 2023-09-25 15:16:41 +02:00
30ea01bc31 StringExample: remove obsolete comment 2023-09-24 18:12:01 +02:00
92c9faf69f Fix 'std::string_view' has not been declared (issue #1967)
Ported from 49e2a8d421
2023-09-13 18:32:38 +02:00
b20653ee1a Fix 'std::string' has not been declared (issue #1967)
Ported from 259855a87b
2023-09-13 18:31:22 +02:00
750d53f8c7 Update URLs to point to https://arduinojson.org/v7/ 2023-08-19 16:08:12 +02:00
7bd2ea1072 Remove mentions of the zero-copy mode 2023-08-19 16:05:42 +02:00
51c5f1a73a Fix a Clang-Tidy warning 2023-08-10 19:27:03 +02:00
ac9b74df65 Show a warning when ARDUINOJSON_ENABLE_STRING_DEDUPLICATION is defined 2023-08-10 18:38:05 +02:00
305e80c09d Show an error if ARDUINOJSON_SLOT_OFFSET_SIZE is defined 2023-08-10 18:28:38 +02:00
fc1f06822c CI: add GCC 12 2023-08-10 18:25:53 +02:00
a8c763c40e CI: add clang 11, 12, 13, 14, and 15 2023-08-10 18:25:53 +02:00
7ab6fc078c CI: remove Clang 3.8 2023-08-10 18:18:30 +02:00
c98ba999af Add more tests of JsonDocument constructor 2023-08-10 14:30:50 +02:00
1d583f68da Add stubs for JSON_ARRAY_SIZE, JSON_OBJECT_SIZE, and JSON_STRING_SIZE 2023-08-10 09:54:47 +02:00
e93fd7657f Add a "Breaking changes" section to the changelog 2023-08-10 09:54:47 +02:00
78399c2d78 Add a stub for createNestedObject() 2023-08-10 09:54:46 +02:00
8cc645c40c Add a stub for createNestedArray() 2023-08-10 09:54:45 +02:00
11373af344 Add a stub for add() 2023-08-10 09:54:44 +02:00
53d54ba9d7 Add a stub for shallowCopy() 2023-08-10 09:54:44 +02:00
2f31c932d7 Add a stub for memoryUsage() 2023-08-10 09:54:43 +02:00
93cb3d2fdc Add a stub for BasicJsonDocument 2023-08-10 09:54:42 +02:00
be5d5300a2 Add a stub for DynamicJsonDocument 2023-08-10 09:54:40 +02:00
ea5b019552 Add a stub for StaticJsonDocument 2023-08-10 09:54:28 +02:00
bc6707b10c Rename tests/JsonObject/invalid.cpp to unbound.cpp 2023-08-09 12:08:21 +02:00
adea7f4131 Extract VariantRefBaseImpl.hpp 2023-08-09 12:08:21 +02:00
7f459adc4b Remove createNestedArray() and createNestedObject() 2023-08-09 12:08:21 +02:00
cdc1262127 Remove unused JsonDocument constructor 2023-08-09 11:07:27 +02:00
f422b7b37d Replace add() with add<T>() (add(T) is still supported) 2023-08-09 10:57:52 +02:00
7a587ac2e2 Fix some getVariant() that were accidentally renamed to getSlot() 2023-08-09 10:08:40 +02:00
38941d5807 Tests: use sections for filters tests 2023-08-01 19:14:11 +02:00
57454cf97b Don't call shrinkToFit() for deserializeXxx(JsonVariant) 2023-08-01 18:48:10 +02:00
af6954c224 serializeXxx() sets std::string and String instead of appending 2023-07-31 18:37:35 +02:00
3003756adb Reformat filters test file 2023-07-31 17:34:53 +02:00
218a12ca46 Call shrinkToFit() in deserializeJson() and deserializeMsgPack() 2023-07-31 17:34:17 +02:00
752d01a7f1 Add an enable_if to validate the first argument to deserializeXxx() 2023-07-29 12:05:18 +02:00
43eed00cd9 Add deserializeXxx(JsonVariant, ...) (resolves #1226) 2023-07-29 12:05:18 +02:00
bc8ea36781 Tests: gather deserializeMsgPack() errors test cases 2023-07-29 06:33:45 +02:00
8fb187baed Tests: gather deserializeJson() errors test cases 2023-07-29 06:33:45 +02:00
db5b5f9ee2 Fix a typo in the changelog 2023-07-29 06:33:44 +02:00
9122d87f12 Tests: remove duplicate test of incomplete input 2023-07-27 14:31:56 +02:00
9a11d98117 Tests: make allocator assertions more readable 2023-07-26 09:28:21 +02:00
30ec507989 Tests: use a consistent naming convention for allocators 2023-07-25 14:53:54 +02:00
7a76da3bc7 Tests: rename ControllableAllocator to KillswitchAllocator 2023-07-25 14:46:25 +02:00
a8329564e2 Remove JsonDocument::garbageCollect() 2023-07-25 14:37:25 +02:00
00c9d8680a Remove memoryUsage() 2023-07-24 17:21:25 +02:00
2fdacb1ca0 Reduce size of CollectionData::clear() 2023-07-24 10:33:06 +02:00
228c4cf9fa JsonDocument: use the copy-and-swap idiom 2023-07-24 10:13:17 +02:00
9d2d257851 Scripts: call wandbox/publish.sh from get-release-page.sh
Ported from 371fa4667e
2023-07-23 18:08:54 +02:00
5458e916ea Show a link to the doc when user passes an unsupported input type
Ported from 7eec01cdd6
2023-07-23 18:08:21 +02:00
1a14499612 Preallocate pool list 2023-07-21 17:57:13 +02:00
f427706e06 VariantPoolList: handle SlotId overflow 2023-07-21 17:57:13 +02:00
8be0d57d24 VariantPoolList: reduce the size of capacity_ and count_ 2023-07-21 09:47:25 +02:00
8fcaebb44a Detect null slot id earlier in VariantPoolList::getSlot() 2023-07-20 18:04:06 +02:00
bd2d232b40 JsonParseExample: use a const char* instead of a char[] 2023-07-20 18:04:06 +02:00
b69a952e69 Examples: remove outdated comments 2023-07-20 18:04:06 +02:00
727a1013ca Recycle removed slots 2023-07-20 18:04:06 +02:00
781e449e78 CollectionData::releaseSlot() takes an iterator 2023-07-20 17:53:52 +02:00
d4af8cffa7 Store current and next slot id in CollectionIterator 2023-07-20 17:53:52 +02:00
0f3c73a211 Remove VariantPool::capacity() 2023-07-18 09:08:55 +02:00
0f319e7ca4 Remove capacity from JsonDocument's constructor 2023-07-18 09:08:55 +02:00
42b2840009 Create more memory pools as needed (resolves #1074) 2023-07-18 09:08:55 +02:00
65c67d317a AllocatorLog: support nulls in deallocate() and reallocate() 2023-07-17 17:28:49 +02:00
c4e5051a7a Store index of slot in the pool instead of a pointer or a distance 2023-07-17 11:20:46 +02:00
068c40d6ed Add Dev Container configs
Ported from 4ba9c1b0c0
2023-07-17 11:20:46 +02:00
c203c86a42 CI: add --output-on-failure for coverage and valgrind tasks 2023-07-17 11:20:46 +02:00
8aec448adf Add missing declaration of offsetof() 2023-07-17 11:20:46 +02:00
9538bc32af Implement the object copy at the JsonObject level 2023-07-17 11:20:46 +02:00
b2aa0029b9 Implement array copy at the JsonArray level 2023-07-17 11:20:46 +02:00
57e9134540 Implement variant copy at the JsonVariant level 2023-07-17 11:20:46 +02:00
fb4cb96c6c Move JsonArray and JsonObject converters to ConverterImpl.hpp 2023-07-17 11:20:46 +02:00
5e3f84c718 Merge all visitXxx() into one overloaded visit() function 2023-07-17 11:20:46 +02:00
64922343e6 visitNull() takes a nullptr_t 2023-07-17 11:20:46 +02:00
1d07abddcd Add nullptr_t 2023-07-17 11:20:46 +02:00
21bf4973de visitRawString() takes a RawString 2023-07-17 11:20:46 +02:00
da845ae01d visitString() takes a JsonString 2023-07-17 11:20:46 +02:00
5a9d3422f5 Add JsonVariantVisitor and use it for comparisons 2023-07-17 11:20:46 +02:00
7a9feb4d6e Rename Visitor to VariantDataVisitor 2023-07-17 11:20:46 +02:00
39e8b63746 Remove shallowCopy() 2023-07-17 11:20:46 +02:00
c37990d791 CollectionData: addSlot() returns an iterator 2023-07-17 11:20:46 +02:00
fac5b5a7a7 CollectionData: allocate the slot in addSlot() 2023-07-17 11:20:46 +02:00
5ceb5d1813 Use CollectionIterator in CollectionData::memoryUsage() 2023-07-17 11:20:46 +02:00
ec4c73db0b Use CollectionIterator in CollectionData::nesting() 2023-07-17 11:20:45 +02:00
f86b22cf4f Replace slotRelease() with CollectionData::releaseSlot() 2023-07-17 11:20:45 +02:00
78a74c4017 Inline slotSize() 2023-07-17 11:20:45 +02:00
dae0182914 Convert CollectionIterator to GoF style 2023-07-17 11:20:45 +02:00
0f511b873d VariantPool: store VariantSlots instead of chars 2023-07-12 15:03:56 +02:00
1d96826371 Add a ResourceManager* member to JsonArrayConst, JsonObjectConst, and JsonVariantConst 2023-07-12 15:03:56 +02:00
f6b014582f Implement object comparison out of class 2023-07-12 15:03:56 +02:00
555f3dd5fe Implement array comparison out of class 2023-07-12 15:03:56 +02:00
04973ca494 Fix ARDUINOJSON_BIN2ALPHA_0110()
Ported from 6c5fde2a55
2023-07-12 15:02:21 +02:00
01b9b40bd2 Include ARDUINOJSON_SLOT_OFFSET_SIZE in the namespace name
Ported from 433fb4b961
2023-07-12 15:01:28 +02:00
c8517ee5b6 Fix double call to size() in serializeMsgPack()
Ported from afbcc2106e
2023-07-12 12:00:23 +02:00
23b01a89b1 Fix double lookup in to<JsonVariant>() 2023-07-05 16:18:35 +02:00
688e21e75f Add CollectionIterator 2023-06-26 18:23:20 +02:00
d921cd6d02 Convert "variant functions" to static member functions 2023-06-26 12:33:34 +02:00
af8bdfbc8f Convert "collection function" to static member functions 2023-06-26 11:58:28 +02:00
68b1602c35 Extract ObjectData from CollectionData 2023-06-26 11:42:25 +02:00
7bc73d7849 Extract ArrayData from CollectionData 2023-06-26 11:18:56 +02:00
67bbb4c90d Manage resources in CollectionData 2023-06-26 10:07:40 +02:00
fffed4fba6 VariantAttorney: replace ResultOfGetData with a trailing return type 2023-06-20 18:47:45 +02:00
8d7bbffe10 Simplify JsonObject::operator== 2023-06-20 18:47:44 +02:00
488475fe16 Simplify JsonArray::operator== 2023-06-20 18:47:42 +02:00
ba8d102432 Swap the parameters of JsonObject's constructor 2023-06-20 18:47:40 +02:00
e96680eb29 Swap the parameters of JsonArray's constructor 2023-06-20 18:47:38 +02:00
4c0fb4eb55 Swap the parameters of JsonVariant's constructor 2023-06-20 18:47:37 +02:00
db2fb01795 Replace VariantPtr, VariantConstPtr, JsonPairPtr, and JsonPairConstPtr with Ptr<T> 2023-06-20 18:47:12 +02:00
18ae8ab7b9 Extract arrayEquals() and objectEquals() 2023-06-19 17:38:17 +02:00
87c96f9306 ResourceManager: rename string functions 2023-06-19 11:25:04 +02:00
262747b419 ResourceManager: extract the StringPool class 2023-06-19 11:15:00 +02:00
3e0ba2028c ResourceManager: extract functions to manipulate StringNodes 2023-06-19 11:14:47 +02:00
972f665b07 Wandbox: upgrade to GCC 5.5.0
Ported from ecbc8e85d4
2023-06-19 09:17:36 +02:00
519e32badb ResourceManager: remove unused operator new 2023-06-18 10:14:39 +02:00
d90b36c009 Extract VariantPool from ResourceManager 2023-06-18 10:14:39 +02:00
8147625921 ResourceManager: replace allocFromPool() with allocVariant() 2023-06-18 10:14:39 +02:00
2cf7fc5427 Remove unused #includes 2023-06-18 10:14:39 +02:00
4871380060 Rename MemoryPool to ResourceManager 2023-06-18 10:14:39 +02:00
2a663db3c7 MemoryPool: store usage and capacity as integers instead of using pointers 2023-06-18 10:14:39 +02:00
437307a955 MemoryPool: store slots at the beginning of the pool 2023-06-14 12:01:31 +02:00
56b3b4d5a9 MemoryPool: remove unused functions 2023-06-14 12:01:31 +02:00
f5355a9eb5 Move all functions from VariantFunctions.hpp to `VariantData.hpp 2023-05-26 14:09:12 +02:00
779ee07de9 Add VariantData::copyFrom() 2023-05-26 14:09:12 +02:00
ab4e8547cb Add VariantData::getOrAddElement() 2023-05-26 14:09:12 +02:00
585795d002 Add VariantData::removeElement() 2023-05-26 14:09:12 +02:00
68a167b167 Add VariantData::nesting() 2023-05-26 14:09:12 +02:00
78d4f721ff Add VariantData::removeMember() 2023-05-26 14:09:00 +02:00
a97bcb6b2d Add VariantData::getOrAddMember() 2023-05-26 14:09:00 +02:00
2da1f2553d Add VariantData::addElement() 2023-05-26 14:09:00 +02:00
c267b55dec Move raw string copy logic into VariantData::setRawString() 2023-05-25 10:06:01 +02:00
3a73ccf027 Move string copy logic into VariantData::setString() 2023-05-25 09:55:43 +02:00
8ab45e6f82 Add JsonVariant::release() 2023-05-25 09:35:40 +02:00
da45c4bc4f Fix memory leak in JsonDeserializer when object key is repeated 2023-05-25 09:21:54 +02:00
48acf963fb Remove VariantImpl.hpp 2023-05-25 09:06:05 +02:00
ccccd1da11 Sort VariantData's members alphabetically 2023-05-25 09:06:05 +02:00
78a30496be Define all VariantData's member functions inline 2023-05-25 09:03:16 +02:00
636c8c36eb Decouple MemoryPool from VariantSlot 2023-05-22 17:56:04 +02:00
5070fa6562 Rename memberFilter to elementFilter in deserializers 2023-05-22 14:11:59 +02:00
d9e035a288 Remove VariantData::isEnclosed() 2023-05-22 09:46:35 +02:00
aba8974148 Extract StringNode.hpp 2023-05-22 09:05:48 +02:00
044a4753d2 Rename StringCopier to StringBuilder 2023-05-10 10:12:55 +02:00
ff0deee793 Remove string storage policy to always use StringCopier 2023-05-10 10:02:48 +02:00
37357086e2 Remove the zero-copy mode
After removing the string size from `VariantContent`, `deserializeJson()` and `deserializeMsgPack()` could not support NUL in strings in the zero-copy mode anymore.
Instead of adding a complicated warning in the documentation, I thought it was better to remove the zero-copy mode entirely.
The zero-copy mode has always been a source of bugs because many users used it without realizing it.
Also, the memory savings are smaller now that we deduplicate strings, so this feature should not be missed much.
2023-05-10 09:55:21 +02:00
9321f8fdab Remove string size from VariantContent (#1650) 2023-05-02 18:56:17 +02:00
167ea08c53 Pass StringNode* to VariantData 2023-05-02 18:56:02 +02:00
5c0338970c Remove StoragePolicy 2023-05-02 17:52:53 +02:00
6b4dd3ff2f Fix build on ESP32 (caused by espressif/arduino-esp32#7941) 2023-05-02 10:48:02 +02:00
fead19560c Rename visitRawJson() to visitRawString() 2023-05-02 10:06:27 +02:00
86772d33bc Rename VALUE_IS_OWNED_RAW to VALUE_IS_RAW_STRING 2023-05-02 10:03:37 +02:00
a035116018 Remove unused struct RawData 2023-05-02 10:00:46 +02:00
806fa907ab Always store serialized("string") by copy (#1915) 2023-05-02 09:36:40 +02:00
95f5d9d134 Fix compatibility with the Blynk libary (fixes #1914)
Ported from 52d8a65cbc
2023-04-21 19:08:53 +02:00
03139a08af Set default for ARDUINOJSON_ENABLE_PROGMEM to 1 on AVR
Ported from 082ae69e86
2023-04-21 19:08:53 +02:00
acfbf26e37 CI: check build configuration on AVR
Ported from 976a6d7594
2023-04-21 19:08:53 +02:00
461cdaa818 Allow using PROGMEM outside of Arduino (fixes #1903)
Ported from 40daf56b5a
2023-04-21 19:08:53 +02:00
dd46813dc0 Change naming convention from _member to member_ (fixes #1905)
Ported from 31ce648e63
2023-04-21 18:59:48 +02:00
5d796781fb Increase coverage 2023-04-21 18:39:47 +02:00
f5e7570f84 Simplify CollectionData to work only with VariantSlot* 2023-04-21 16:11:54 +02:00
003087406c Reference-count shared strings 2023-04-21 16:11:54 +02:00
b7c8e0d25c Decouple VariantData from MemoryPool 2023-04-21 16:11:54 +02:00
30c111fd3d Remove callback from storeString() 2023-04-17 10:42:08 +02:00
9d0714efdf Remove unused MemoryPool::_left 2023-04-17 10:42:08 +02:00
d8f3058efa Store the strings in the heap 2023-04-17 10:42:08 +02:00
7c0fa7c276 Add MemoryPool::deallocPool() 2023-04-08 09:20:27 +02:00
6eb4f45fb9 Tests: ControllableAllocator controls reallocate() too 2023-04-08 09:18:15 +02:00
b3132cac3a Tests: add SpyingAllocator::clearLog() 2023-04-07 18:30:31 +02:00
d95a3bd19a Tests: add TimebombAllocator 2023-04-07 18:28:46 +02:00
22e4f216c3 Tests: allow ArmoredAllocator to be called multiple times 2023-04-07 18:27:38 +02:00
e9850152a7 Tests: replace constants with sizeofString(n) 2023-04-07 14:50:54 +02:00
5e0e35615c Double speed of DynamicJsonDocument::garbageCollect() 2023-04-05 16:50:52 +02:00
c4b879645a Remove JsonDocument::capacity() 2023-04-03 09:51:43 +02:00
6afa6b647c Test: Support failed allocations in SpyingAllocator 2023-04-03 09:51:10 +02:00
acd465b365 Test: change ControllableAllocator into a decorator 2023-04-03 09:51:10 +02:00
e858570afb Test: change SpyingAllocator into a decorator 2023-04-03 09:51:09 +02:00
0643c2e708 Test: gather JsonDocument constructor and assignment tests 2023-04-03 09:51:09 +02:00
bcf1339e89 Test: split JsonDocument.cpp into multiple files 2023-04-03 09:51:09 +02:00
dc463a2f72 Test: remove REQUIRE_JSON() 2023-04-03 09:51:09 +02:00
a7cdf638e7 Test: move ControllableAllocator 2023-04-03 09:51:09 +02:00
57810af2ac Test: include deallocated size in allocator's log 2023-04-02 16:47:59 +02:00
2eb726b744 Test: add AllocatorLog 2023-04-02 16:47:59 +02:00
912137ccfb Test: share SpyingAllocator 2023-04-01 10:34:48 +02:00
035c913c72 Remove ARDUINOJSON_ENABLE_STRING_DEDUPLICATION 2023-03-29 19:28:44 +02:00
3f43c2b816 Remove JSON_ARRAY_SIZE(), JSON_OBJECT_SIZE(), and JSON_STRING_SIZE() 2023-03-29 19:18:06 +02:00
0328f66340 Fix compatibility with GCC 5.2 2023-03-28 17:24:45 +02:00
b3eada9c7f CI: restore build on GCC 5 2023-03-28 14:53:15 +02:00
8516b368ad Set version to 7.0.0-alpha 2023-03-28 14:45:55 +02:00
d0fff5a0b5 Update branch to 7.x 2023-03-28 14:43:48 +02:00
4c8d4b4e20 Remove badges linking to the library registries 2023-03-28 14:43:03 +02:00
5faa3df43f MemoryPool calls the Allocator directly 2023-03-20 15:03:09 +01:00
540901e219 Merge DynamicJsonDocument with JsonDocument 2023-03-20 14:49:51 +01:00
db9258bcd7 Remove BasicJsonDocument 2023-03-20 14:49:08 +01:00
24aaab6e3e Add abstract Allocator class 2023-03-20 14:47:27 +01:00
17a482a9b1 Remove StaticJsonDocument 2023-03-20 10:40:35 +01:00
5edd435fe9 Add a constructor to VariantData 2023-03-20 10:14:54 +01:00
de9239caab Set version to 6.21.0 2023-03-14 21:05:56 +01:00
c89a2025ce Make string support generic (issue #1807) 2023-03-13 12:19:05 +01:00
42ae8c3037 Remove negativeBinaryPowersOfTenPlusOne 2023-02-22 15:42:10 +01:00
319ececf26 Keep only one implementation of make_float() 2023-02-22 15:42:10 +01:00
886254c41e Reduce size of make_float() 2023-02-22 15:42:10 +01:00
4e7099dc73 Add pgm_ptr<T> 2023-02-22 15:42:10 +01:00
26948cb83a Use 64-bits literals to forge 64-bits literals 2023-02-22 11:40:15 +01:00
0f8698e655 Replace ARDUINOJSON_EXPANDX with variadic macros (#1820) 2023-02-22 11:24:51 +01:00
b2b995edb3 Use delete instead of hiding copy constructors and assignments (#1820) 2023-02-17 10:59:57 +01:00
33a4773fbd Set clang-format standard to C++11 (#1820) 2023-02-16 11:51:02 +01:00
daa87e12dc Update copyright notice 2023-02-16 11:45:01 +01:00
5abf512276 Reduce number of overloads of deserializeJson() and deserializeMsgPack() (#1820) 2023-02-16 11:17:15 +01:00
0dd4a68913 Use only letters to encode configuration in the namespace 2023-02-14 10:04:49 +01:00
8971127b66 Fix build on GCC 6 2023-02-14 10:04:49 +01:00
1b66a217bf Replace ARDUINOJSON_NAMESPACE with an inline namespace (#1820) 2023-02-14 10:04:48 +01:00
34dd46110b Remove safe bool idiom (#1820) 2023-02-13 11:12:41 +01:00
8f7211a50f Remove ARDUINOJSON_HAS_NULLPTR (#1820) 2023-02-10 17:02:52 +01:00
2be4ee732a Remove ARDUINOJSON_HAS_RVALUE_REFERENCES (#1820) 2023-02-10 17:02:52 +01:00
3bdedc9a2f Remove ARDUINOJSON_HAS_LONG_LONG (#1820) 2023-02-10 17:02:52 +01:00
f699954f4d Remove support for __int64 (#1820) 2023-02-10 17:02:52 +01:00
407fc2cd45 Drop support for C++98/C++03 (closes #1820) 2023-02-10 17:02:52 +01:00
91fe6dcae8 Fix clang-tidy warning "Called C++ object pointer is null" 2023-02-10 17:02:51 +01:00
62dea9d364 Reformat CMake files 2023-02-10 17:02:51 +01:00
e0bdc4bff1 Remove unused variables (fixes #1858) 2023-02-10 17:02:51 +01:00
007b4f3362 Update Catch library to 2.13.10 (#1820) 2023-02-10 17:02:51 +01:00
94b2b3f9ce Run all tests with C++11 enabled (#1820) 2023-02-10 17:02:51 +01:00
c2de812cbd Set minimum Clang version to 3.8 (#1820) 2023-02-10 17:02:51 +01:00
669ee4dfe3 Set minimum GCC version to 6 (#1820) 2023-02-10 17:02:33 +01:00
e054cba610 Set minimum Visual Studio version to 2017 (#1820) 2023-02-10 14:49:24 +01:00
3d8287265c Remove unused NOEXCEPT macro 2023-02-09 19:06:36 +01:00
de7afc2015 Minor improvements in the release workflow 2023-02-08 16:51:47 +01:00
ae0499fd57 Update idf_component.yml 2023-02-08 16:46:15 +01:00
b33966c755 Set version to 6.20.1 2023-02-08 16:42:04 +01:00
d2cd13bf2e CI: automatically publish Particle library 2023-02-08 16:40:06 +01:00
06b2263329 README: reduce the size of the logo 2023-02-08 16:40:06 +01:00
d4bb839ce9 CI: remove the draft flag on the GitHub Release 2023-02-08 16:40:04 +01:00
6013a1a56f Fix the name of the license file 2023-02-08 16:40:01 +01:00
34b38e07c7 Deduce template argument of pgm_read() 2023-01-26 18:10:41 +01:00
1ec16ca94f Use pgm_read() instead of ARDUINOJSON_READ_STATIC_ARRAY 2023-01-26 14:55:46 +01:00
b350a96643 Remove explicit exclusion of as<char*>() and as<char>() (#1860)
If you try to call them, you'll now get the same error message as any unsupported type.
You could also add a custom converter for `char*` and `char`.
2023-01-18 22:10:37 +01:00
bf93779b4f Update catch.hpp (fixes #1856)
See also catchorg/Catch2#2627
2023-01-17 13:53:47 +01:00
dd0f7019ef CI: Update runner to get GCC 11.3 (resolves #1859) 2023-01-17 13:53:47 +01:00
175e5b3062 Add missing semicolon (fixes #1857) 2023-01-17 08:59:45 +01:00
7885155634 Add to IDF Component Registry (closes #1844) 2023-01-14 09:26:12 +01:00
1909ffe0f9 Remove link to Discord server 2023-01-13 08:52:33 +01:00
3345255f16 Fix comma tests. 2023-01-13 08:21:54 +01:00
c49adfd6da Test custom converter for std::array (issue #1840) 2022-12-31 10:48:20 +01:00
5094b84a46 Set version to 6.20.0 2022-12-26 17:35:54 +01:00
191fc5dff4 Remove support for naked char (was deprecated since 6.18.0) 2022-12-26 11:02:34 +01:00
cb9c90f2d0 Mark adapter's storagePolicy() as const 2022-12-26 10:23:48 +01:00
09f9bd6b8b Fix detection of char types 2022-12-26 10:21:57 +01:00
67abbef818 Fix GitHub Actions badge (badges/shields#8671) 2022-12-26 10:09:06 +01:00
7ed2559e9e Test custom converter for std::vector<T> (issue #1840) 2022-12-26 10:09:06 +01:00
ac8e5f01db Clang-Format: set AllowShortLoopsOnASingleLine to false 2022-12-24 15:48:00 +01:00
396d2a7b3b CI: check URLs 2022-12-21 19:20:51 +01:00
de725e0a4e Add documentation to most public symbols 2022-12-21 19:20:51 +01:00
2a32803e9e CI: Replace set-output with environment file
https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
2022-12-19 14:58:15 +01:00
d602232b9f Update change log 2022-12-19 14:41:53 +01:00
b0730f04f7 Rename VariantRef to JsonVariant 2022-12-19 14:41:53 +01:00
ef8ed28aec Rename VariantConstRef to JsonVariantConst 2022-12-19 14:41:43 +01:00
b8eff868e6 Rename String to JsonString 2022-12-19 14:41:43 +01:00
d0b619ea93 Rename UInt to JsonUInt 2022-12-19 14:41:43 +01:00
652d70fe2c Rename Integer to JsonInteger 2022-12-19 14:41:43 +01:00
8228aec74b Rename Float to JsonFloat 2022-12-19 14:41:43 +01:00
2f2e0e9415 Rename ObjectIterator to JsonObjectIterator 2022-12-19 12:21:11 +01:00
3a9803679f Rename Pair to JsonPair 2022-12-19 12:21:11 +01:00
dc42d93b0f Rename ObjectConstRef to JsonObjectConst 2022-12-19 12:20:37 +01:00
dff07ebfe8 Rename ObjectRef to JsonObject 2022-12-19 12:20:13 +01:00
4c456a95a3 Rename ArrayIterator to JsonArrayIterator 2022-12-19 12:12:28 +01:00
83e5d9d150 Rename ArrayConstRef to JsonArrayConst 2022-12-19 12:12:28 +01:00
7079aa99d7 Rename ArrayRef to JsonArray 2022-12-19 12:10:58 +01:00
208a22e324 Update GitHub action dessant/lock-threads 2022-12-13 08:28:20 +01:00
9afae963e8 Update tutorial links to point to version 6 2022-12-05 21:00:46 +01:00
1828dec658 CI: add CTest output to the job summary 2022-12-05 21:00:24 +01:00
afe2434baf Extract ObjectConstRef.hpp from ObjectRef.hpp 2022-12-05 21:00:24 +01:00
e08f8d5b51 Inline class ObjectRefBase 2022-12-05 21:00:24 +01:00
7e3b40f379 Extract ArrayConstRef.hpp from ArrayRef.hpp 2022-12-05 21:00:24 +01:00
584770dc6f Inline class ArrayRefBase 2022-12-05 21:00:24 +01:00
5d2a440c69 Remove ArrayFunctions.hpp and ObjectFunctions.hpp 2022-12-05 21:00:24 +01:00
ac14f29e6c Move definitions of JSON_ARRAY_SIZE() and JSON_OBJECT_SIZE() 2022-12-05 21:00:24 +01:00
3d62fa8af2 CI: use ubuntu-20.04 for GCC 2022-12-05 21:00:24 +01:00
0f85a55cac Implement VariantRefBase with a CRTP 2022-12-05 21:00:24 +01:00
21db92af47 Simpify variant reader 2022-11-26 18:32:33 +01:00
6447520b5b Replace Yes/No with int/char 2022-11-22 18:56:42 +01:00
079ccadbee Remove sponsor techexplorations 2022-11-08 08:59:18 +01:00
615f675840 Update dessant/lock-threads 2022-11-03 10:11:45 +01:00
2182c83b87 Remove ArrayShortcuts and ObjectShortcuts 2022-11-02 09:18:02 +01:00
b8d1dccb21 Test IsString<String> and IsString<StringSumHelper> 2022-10-31 18:02:07 +01:00
c3d5e9382d Implement IsString from StringAdapter 2022-10-26 17:20:33 +02:00
ecb72f9a9d Add StringAdapter<T> 2022-10-26 16:19:14 +02:00
7004c39af6 variantGetOrAddMember() takes an adapted string like all its siblings 2022-10-26 10:44:21 +02:00
057956225c Add namespace StringStoragePolicy 2022-10-26 10:41:42 +02:00
b27990f780 Attach copy policy to string adapters 2022-10-26 10:37:18 +02:00
61c6f8ba59 CI : update macOS runner 2022-10-21 17:40:52 +02:00
d8d37ba7ad CI: update deprecated actions 2022-10-21 17:37:15 +02:00
92d6bae25c Remove ArrayIterator::internal() and ObjectIterator::internal() 2022-10-14 18:11:55 +02:00
6e17c3e6f9 Extract VariantRefBase from VariantProxy 2022-10-03 19:14:05 +02:00
8ee67b0229 Fix brew: command not found (actions/runner-images#6283) 2022-10-03 09:54:48 +02:00
07b9153ae4 CI: Add CodeQL 2022-09-22 10:05:55 +02:00
abfcac4674 README: bigger logo on mobile 2022-09-20 17:01:47 +02:00
cde8cd50f8 VSCode: configure include path 2022-09-20 16:55:43 +02:00
cf4436e581 Extract VariantProxy from ElementProxy and MemberProxy 2022-08-30 10:25:03 +02:00
2b6bb78a09 Don't call operator VariantConstRef in VariantComparer 2022-08-30 10:25:03 +02:00
ffa7f8d22d Make MemberProxy and `ElementProxy similar 2022-08-30 10:25:03 +02:00
f73be9cf0f Fix typo.
DeserializationOpion --> DeserializationOption
2022-08-10 09:06:45 +02:00
8002722f3b Clang-format: set DerivePointerAlignment to false 2022-08-09 16:52:17 +02:00
62e83133cd Remove JsonDocument::data() and JsonDocument::memoryPool() 2022-08-09 10:38:36 +02:00
1d21027e2a Fix lax parsing of true, false, and null (fixes #1781) 2022-08-06 09:15:07 +02:00
5705247e5f Fix replacement for getOrAddElement() and getOrAddMember() 2022-08-04 10:47:02 +02:00
dde9e9fc26 Remove member MsgPackDeserializer::_error
This reduces the code size by 54 bytes on AVR.
2022-07-29 11:51:46 +02:00
a6da4ad452 Remove member JsonDeserializer::_error
This reduces the code size by 72 bytes on AVR.
2022-07-29 11:51:46 +02:00
e2a29eef24 CI: simplify Ubuntu package sources 2022-07-29 11:31:09 +02:00
043ee651a9 CI: remove dependency on Ubuntu 21.04 "The Hirsute Hippo" 2022-07-29 11:30:47 +02:00
84b7037b3e Add VariantAttorney 2022-07-07 14:32:43 +02:00
c5838a876b Remove getElement(), getOrAddElement(), getMember(), and getOrAddMember() 2022-07-07 14:32:43 +02:00
750cd0be92 Add collectionToVariant() 2022-07-07 14:32:43 +02:00
758580bfb6 Rename addElement() to add() 2022-07-07 14:32:43 +02:00
04872b6db8 Simplify ProgmemExample.ino and StringExample.ino 2022-07-07 14:32:41 +02:00
58c7c919f2 Remove unused arrayAccept() and objectAccept() 2022-07-07 09:44:58 +02:00
cd8373ad32 Change link() to shallowCopy() (issue #1343)
Instead of storing a pointer, the function copies the `VariantData`.

Benefits:
* smaller code
* no impact on programs that don't use this feature

Drawbacks:
* changes to the original variant are not always reflected on the copy
* modifying the original from the shallow copy leads to UB
2022-07-05 17:07:43 +02:00
3b3ab8c4e1 Inline variantAsArray() and variantAsObject() 2022-07-05 14:02:41 +02:00
5b06b1564e Remove undocumented accept() functions 2022-07-03 17:38:03 +02:00
77b4270d97 Remove Visitable 2022-07-03 15:37:08 +02:00
7c2ca773ff README: update Tech Explorations's link 2022-06-10 12:12:26 +02:00
e2bb2cec7b Fix comparison operators for JsonObject and JsonObjectConst 2022-06-10 11:14:59 +02:00
ff4e837df5 Fix comparison operators for JsonArray and JsonArrayConst 2022-06-09 21:06:32 +02:00
fb904033d3 Replace serializeJson()'s template parameter with JsonVariantConst 2022-06-02 20:36:32 +02:00
e6cd16aec4 Add missing const specifiers in serializers 2022-05-23 19:20:15 +02:00
ee74c3bb1c Inline variantAccept() 2022-05-23 19:17:18 +02:00
37faa7ce13 Merge definitions of VariantConstRef::accept() and VariantRef::accept() 2022-05-23 19:11:09 +02:00
3d6c328a4f Add JsonVariant::link() (resolves #1343) 2022-04-27 15:08:13 +02:00
5577d18377 JsonVariant: add tests for size() 2022-04-27 15:08:13 +02:00
1d103a1528 MemberProxy: move tests for createNestedArray() and createNestedObject() 2022-04-27 15:07:26 +02:00
7b19a4b6e7 Add getMemberConst() and getElementConst() 2022-04-27 15:07:26 +02:00
ac1d29fac0 Add meta function ConverterNeedsWriteableRef<T> 2022-04-27 15:07:26 +02:00
98037e5742 Move several functions from VariantImpl.hpp to VariantRef.hpp 2022-04-27 15:07:26 +02:00
d0e3808dd0 Move declaration of VariantConstRef above VariantRef 2022-04-27 15:07:25 +02:00
3760a643cb Implement comparison out of VariantData 2022-04-27 15:07:25 +02:00
fc9d8aa31e Implement nesting() out of VariantData 2022-04-07 21:11:31 +02:00
ccfbb5fd1d Fix 9.22337e+18 outside range of representable values of type 'long' 2022-04-07 20:59:20 +02:00
c9fbc5e40a README: remove utm_source/utm_medium to make links more readable (#1735) 2022-04-07 18:49:39 +02:00
67b6797b6d Set version to 6.19.4 2022-04-05 10:53:11 +02:00
8d9504239b Fix comparisons operators with const JsonDocument& 2022-04-05 10:12:17 +02:00
bf5d0c790c Add implicit conversion from JsonDocument to JsonVariant 2022-03-23 17:17:35 +01:00
f4379f97ae Format code with clang-format 2022-03-23 17:17:35 +01:00
3dc67c5663 Add memoryUsage() to ElementProxy and MemberProxy (fixes #1730) 2022-03-19 12:11:40 +01:00
47f90b02c3 CI: run apt-get update before installing g++-multilib 2022-03-09 08:33:26 +01:00
27c924746b CI: run apt-get update before installing valgrind 2022-03-08 19:09:56 +01:00
7abf875071 Set version to 6.19.3 2022-03-08 17:24:14 +01:00
e3e375f5cd MessagePack: serialize round floats as integers (fixes #1718) 2022-02-28 19:38:26 +01:00
ff06292d74 Fix -Wsign-conversion -funsigned-char (fixes #1715) 2022-02-28 10:00:12 +01:00
c1278797f2 CI: use -funsigned-char in one GCC build (issue #1715) 2022-02-28 09:50:32 +01:00
421ecec0dd Tests: trim trailing white spaces 2022-02-25 10:28:42 +01:00
89ed54362b Fix -Wsign-conversion on GCC 8 (fixes #1715) 2022-02-25 10:28:42 +01:00
986f77fa15 Tests: link with -static on MinGW 2022-02-25 10:28:22 +01:00
f831ed395d Fix JsonString operator == and != for non-zero-terminated string 2022-02-17 17:33:16 +01:00
a880614a75 Fix call of overloaded 'String(const char*, int)' is ambiguous 2022-02-17 17:33:16 +01:00
ef8379df1b Set version to 6.19.2 2022-02-14 09:06:06 +01:00
702f8c2e2f Fix cannot convert 'pgm_p' to 'const void*' (fixes #1707) 2022-02-06 11:14:23 +01:00
6806393285 Wandbox: update compiler version 2022-01-14 09:23:12 +01:00
dea8387586 Publish script: don't stop if wandbox fails 2022-01-14 09:22:55 +01:00
6ea2815341 Set version to 6.19.1 2022-01-14 08:49:57 +01:00
3c145f1782 Add assertions to comfort Clang-Tidy 2022-01-13 20:25:49 +01:00
21b2c76524 Fix filter not working in zero-copy mode (fixes #1697) 2022-01-13 20:25:49 +01:00
4f6244eef4 Replace CopiedString and LinkedString with JsonString 2022-01-13 16:15:53 +01:00
973858b835 Remove unused CopiedString in MemoryPool 2022-01-13 16:10:42 +01:00
ee12155617 Fix crash when adding an object member in a too small JsonDocument 2022-01-13 11:52:45 +01:00
4b4c68df5f Changelog: remove empty line 2022-01-13 11:52:45 +01:00
fcae33d574 Publish script: fix change log extraction code 2022-01-08 17:59:07 +01:00
896f50eeb9 Publish script: check that all required commands are available 2022-01-08 16:40:21 +01:00
9693fd2d74 Set version to 6.19.0 2022-01-08 16:21:29 +01:00
37f1c87338 Publish script: check that all changes are committed 2022-01-08 16:21:09 +01:00
4977de38fc Remove .devcontainer/ 2022-01-05 12:08:30 +01:00
9f4750637b Add PlatformIO badge to README 2022-01-05 12:08:18 +01:00
0c65e13aa3 Add LGTM grade badge to README 2022-01-02 10:12:13 +01:00
af18994deb Update copyright notice 2022-01-01 10:01:05 +01:00
8f9599cd19 Format appveyor.yml 2022-01-01 10:01:05 +01:00
78660c6e07 Fix support of long long in catch 2022-01-01 10:01:05 +01:00
4f786db82d CI: build on multiple versions of MinGW 2022-01-01 09:51:05 +01:00
ad7b749dec CI: build with arduino-cli 2021-12-31 14:39:39 +01:00
29ba744d64 Add a polyfill for pgm_read_ptr() (issue #1433) 2021-12-31 14:39:38 +01:00
a2e1021d7d Use pgm_read_dword() instead of pgm_read_float() (issue #1433) 2021-12-31 14:39:38 +01:00
d20c3c65c8 Add a polyfill for pgm_read_dword() (issue #1433) 2021-12-31 14:39:38 +01:00
8f029e6096 Fix Visual Studio command line error D9025
https://stackoverflow.com/a/58711983/1164966
2021-12-31 14:39:38 +01:00
91ed68b4a6 Fix conflicting definition of ARDUINOJSON_DEFINE_STATIC_ARRAY() 2021-12-31 14:39:38 +01:00
67fc2d9897 Assume PROGMEM is available as soon as ARDUINO is defined (#1693) 2021-12-31 11:00:50 +01:00
055304bf01 Ignore Visual Studio's /out/ folder 2021-12-29 10:23:15 +01:00
c2800ace32 Include Arduino.h before stdlib.h to avoid conflict (closes #1693) 2021-12-27 13:16:24 +01:00
ec7ffa20f2 Avoid Arduino.h when all its features are disabled (fixes #1692) 2021-12-27 13:16:24 +01:00
ada1f2a894 Add support for char[][] in copyArray() 2021-12-20 17:51:44 +01:00
184a7c4fbd Add support for arbitrary array rank in copyArray() 2021-12-20 17:51:27 +01:00
84e9447f12 Remove redundant copy constructor of AllocatorOwner 2021-12-19 14:08:19 +01:00
ca073fda46 Remove version 5 from change log 2021-12-16 14:56:28 +01:00
0f529a3587 Renamed undocumented function isUndefined() to isUnbound() 2021-12-16 14:55:26 +01:00
e16767af92 Avoid pool reallocation in BasicJsonDocument's copy assignment 2021-12-16 14:42:54 +01:00
3166356484 Test capacity after calling BasicJsonDocument's copy assignment 2021-12-16 14:28:30 +01:00
abdd9d81db Reorder lines in changelog 2021-12-14 10:42:01 +01:00
3bf47761c8 Fix return type of StaticJsonDocument::operator= 2021-12-14 10:41:25 +01:00
f39d8f548f CI: Add Visual Studio 2022 2021-12-12 15:48:51 +01:00
90d750e4d9 Increase coverage 2021-12-07 16:08:44 +01:00
ca24ed48f5 Separate string adapter from storage policy 2021-12-07 16:08:44 +01:00
51937778dd Add operator<<(std::ostream&, const JsonString&) 2021-12-07 16:08:44 +01:00
be70f6ddd7 Support NUL inside string values (issue #1646) 2021-12-07 16:08:44 +01:00
a27398e445 Check for NUL terminator in MemoryPool::findString() 2021-11-24 19:06:49 +01:00
43b2e2e774 Append terminator in saveStringFromFreeZone() 2021-11-24 19:06:49 +01:00
62f9b94ab1 Add CopiedString and LinkedString 2021-11-24 19:06:49 +01:00
b06bbd9d2a Fix inconsistent pool size in BasicJsonDocument's copy constructor 2021-11-23 10:49:35 +01:00
2df1bc7d4f Fix call of overloaded 'swap(...)' is ambiguous (fixes #1678) 2021-11-23 10:47:31 +01:00
599e927590 Fix JsonVariant::memoryUsage() for raw strings 2021-11-12 16:55:41 +01:00
0429016ff1 Remove IsWriteableString 2021-11-12 15:28:33 +01:00
bd42b9638a README: add sponsors section 2021-11-11 09:45:59 +01:00
b1a826b03a README: remove empty lines between the badges 2021-11-11 09:23:58 +01:00
5ed5f3687b Improve test coverage 2021-10-24 09:58:39 +02:00
943a902a0b Remove DeserializationError == bool and DeserializationError != bool 2021-10-24 09:58:39 +02:00
a7873389c6 Change VariantData::asString() return type to JsonString 2021-10-24 09:58:39 +02:00
acfa174333 Add safe bool idiom in JsonString 2021-10-24 09:58:39 +02:00
8418845c8d Add is<JsonString>() 2021-10-24 09:58:39 +02:00
df4a4b9e1d Add as<JsonString>() 2021-10-24 09:58:13 +02:00
7f5497db55 VSCode: exclude catch/ from search 2021-10-22 14:11:50 +02:00
e4658e963f Change the default of ARDUINOJSON_USE_LONG_LONG to 1 on 32-bit platforms 2021-10-19 22:25:45 +02:00
7764515f56 Change the default of ARDUINOJSON_USE_DOUBLE to 1 2021-10-19 22:25:45 +02:00
7046c38c84 Remove ARDUINOJSON_EMBEDDED_MODE 2021-10-19 22:25:45 +02:00
9e9bb30a57 CI: Test ArduinoJson's configuration 2021-10-19 15:36:32 +02:00
41d1be24cc Update GitHub issue templates 2021-10-11 15:20:14 +02:00
7d3b475e24 Update the README 2021-10-11 15:17:36 +02:00
f82a227da6 Set version to 6.18.5 2021-09-28 17:18:44 +02:00
fcd8159617 Set ARDUINOJSON_EMBEDDED_MODE to 1 on Nios II (closes #1657) 2021-09-28 15:58:18 +02:00
f51ccb5c3f README: added link to Discord server 2021-09-21 16:20:52 +02:00
e0cd5b6405 Increased test coverage 2021-09-12 10:13:12 +02:00
6a71f31820 Set version to 6.18.4 2021-09-06 09:11:22 +02:00
3428ab1e89 Added a comment to easily diagnose issue #1648 2021-09-03 08:31:51 +02:00
956e4a7cbb Fixed deserialization of \u0000 (issue #1646) 2021-08-31 14:23:58 +02:00
669bad27d4 CI: added a workaround for adafruit/Adafruit_nRF52_Arduino#653 2021-08-22 18:01:56 +02:00
2c3ae1c181 Filter: exact match takes precedence over wildcard (fixes #1628) 2021-08-13 10:35:15 +02:00
f570fe8c37 Fixed error expected unqualified-id on GCC 11 (fixes #1622) 2021-08-03 11:39:18 +02:00
1b74ad0731 Fixed error 'dummy' may be used uninitialized on GCC 11 2021-08-03 11:39:07 +02:00
6717700d3b CI: added GCC 11 2021-08-03 10:42:37 +02:00
b810833145 Set version to 6.18.3 2021-07-27 15:44:36 +02:00
9d58e566fd Added as<std::string_view>() and is<std::string_view>() 2021-07-27 14:16:39 +02:00
6632fa8da1 Removed StringAdapter::equals() 2021-07-27 14:16:39 +02:00
5790f3c8f7 Refactored string adapters: only one IsString<T> and adaptString() 2021-07-27 14:16:18 +02:00
4073b52c00 Changed return type of convertToJson() and Converter::toJson() to void 2021-07-23 15:11:48 +02:00
f5c7a6478e Publish script: fixed frontmatter for arduinojson.org 2021-07-19 10:19:04 +02:00
ebf58320ca Set version to 6.18.2 2021-07-19 10:11:21 +02:00
09ddb0f824 Publish script: generate the file for arduinojson.org 2021-07-19 09:58:01 +02:00
f02a699c26 CI: added a workflow to create a release when matching tag is pushed 2021-07-16 11:06:50 +02:00
67d0931c19 Added parameters to script build-arduino-package.sh 2021-07-16 09:35:32 +02:00
19d079c33c Removed a symlink because the Arduino Library Specification forbids it 2021-07-15 12:50:22 +02:00
40723a4cc7 CI: check that the repository doesn't contain any symlink
The Arduino Library Specification forbids symlinks, that's probably the reason why version 6.18.1 is missing from the Library Manager.
2021-07-15 12:50:22 +02:00
8a9a26588c Fixed publish script 2021-07-03 16:08:36 +02:00
219475630a Set version to 6.18.1 2021-07-03 16:03:01 +02:00
52e856fa6f CI: added ESP-IDF component build (closes #1599) 2021-06-30 13:34:59 +02:00
cb2c029e57 Added support for ESP-IDF component build (closes #1562) 2021-06-30 10:29:28 +02:00
ef7579394b Fixed JsonVariant::as<unsigned>() (fixes #1601) 2021-06-30 09:58:03 +02:00
fc4f175300 CI: fixed ARM compiler installation 2021-06-28 09:10:15 +02:00
a6fc9311b4 Added JsonArray::clear() (fixes #1597) 2021-06-26 11:29:15 +02:00
14639f129e CMake: added empty line at end of each file 2021-06-26 11:29:15 +02:00
9182c2068d Fixed build-single-header.sh (fixes #1592) 2021-06-21 16:11:02 +02:00
cb1b3be723 CI: build single headers 2021-06-21 16:11:02 +02:00
5ccd62a789 Updated the readme 2021-06-18 11:39:00 +02:00
145d45c746 Fixed warning on Clang 10 2021-06-17 20:41:04 +02:00
f235157466 Added support for std::string_view (closes #1578, closes #1554) 2021-06-17 20:41:04 +02:00
ba5cdab619 Test: extracted executable Cpp11Tests 2021-06-17 20:28:09 +02:00
eab5ae2f07 Simplified string adapters 2021-06-16 21:08:05 +02:00
2f0b3c0e63 VSCode: added devcontainer configuration 2021-06-16 21:08:05 +02:00
4e261068a1 clang-format: set IndentPPDirectives to AfterHash 2021-06-16 21:08:01 +02:00
1d24caf066 Added InvalidConversion to identify invalid conversions (closes #1585) 2021-06-11 11:54:52 +02:00
dc76c5165f Fixed clang-tidy warnings (fixes #1574) 2021-06-04 12:00:33 +02:00
de11b36a98 clang-tidy: muted "uninitialized pointer/field" in StringCopier 2021-06-04 11:38:21 +02:00
c4a4ed5272 clang-tidy: muted "uninitialized field" in Latch 2021-06-04 11:37:07 +02:00
a24edac5a9 clang-tidy: muted "use of memory after it is freed" in MemoryPool 2021-06-04 11:37:07 +02:00
9dbf44388d clang-tidy: muted "call to function is insecure" in tests 2021-06-04 11:37:07 +02:00
6b8e93e05e clang-tidy: fixed "uninitialized field" in VariantData 2021-06-04 11:36:20 +02:00
6b5239b9d5 clang-tidy: removed unused field 2021-06-04 11:16:24 +02:00
214c06b771 clang-tidy: fixed clang-analyzer-optin.cplusplus.UninitializedObject 2021-06-04 11:16:17 +02:00
e32a8552be CI: added clang-tidy (closes #1577) 2021-06-04 11:00:16 +02:00
9bcb409648 Fixed serializeJson(doc, String) when allocation fails (fixes #1572) 2021-05-30 21:34:07 +02:00
3b10afd2ab CI: test more platforms on PlatformIO 2021-05-30 18:45:40 +02:00
af3bb131c8 Fixed error Pe070 "incomplete type is not allowed" on IAR (fixes #1560) 2021-05-19 15:07:59 +02:00
622e7dd287 Fixed support for volatile float and double (fixes #1557) 2021-05-19 15:01:51 +02:00
68082e6fc1 CI: use libc++ for Clang 3.5 to 4.0
The fixes the error: "__STRICT_ANSI__ seems to have been undefined; this is not supported" with Clang 3.9
2021-05-17 09:06:28 +02:00
36bcc7b355 Set version to 6.18.0 2021-05-05 20:41:35 +02:00
c7c0b729c1 Added a deprecation warning for is<char>() and is<char*>() 2021-05-05 15:43:02 +02:00
6aeefda3b6 CI: Skip WillFail and Fuzzing test labels when measuring coverage 2021-05-04 16:36:21 +02:00
4780174ee1 Added a deprecation warning for as<char>() and set(char) 2021-05-04 16:10:50 +02:00
ab23625091 Renamed DEPRECATED to ARDUINOJSON_DEPRECATED 2021-05-04 14:44:07 +02:00
a88cf8fab7 PlatformIO: set build.libArchive to false (closes #1550) 2021-05-03 08:55:20 +02:00
2be528a3fa serializeMsgPack(doc, p, n) doesn't add terminator anymore (fixes #1545) 2021-04-29 20:59:15 +02:00
337864618c Reversed parameters of convertToJson() and convertFromJson()
Now the order matches copyArray(): source first, destination second.
2021-04-28 10:25:39 +02:00
526cad54d7 VSCode: insert final new line 2021-04-27 18:25:42 +02:00
506cf7f438 Added .prettierignore 2021-04-27 18:25:42 +02:00
4b89878c10 Added a deprecation warning for as<char*>() 2021-04-27 18:25:42 +02:00
06fad301cb CI: added Valgrind job (closes #1542) 2021-04-25 20:58:22 +02:00
7be0c2c650 CMake: added labels to tests 2021-04-25 11:38:19 +02:00
43f0db45ad Updated Catch library to 1.12.2 2021-04-22 08:54:16 +02:00
892c37db08 Optimized JsonVariant::is<float>() 2021-04-21 13:21:40 +02:00
d8a1d1a120 Increased coverage of ConverterImpl.hpp 2021-04-18 17:23:51 +02:00
64e52e97ee Removed redundant range check in MemoryPoolPrint 2021-04-18 16:47:28 +02:00
2a777a659a Fixed reference-binding-to-null-pointer in MsgPack deserializer 2021-04-15 14:56:59 +02:00
898f429826 Fixed member-call-on-null-pointer in getMember() when array is empty 2021-04-15 14:56:59 +02:00
88fbe3ac34 Fixed undefined behavior in JSON serializer 2021-04-15 14:56:59 +02:00
4ddc674846 CI: fixed sanitizers errors not been reported 2021-04-15 11:11:50 +02:00
fc4f5fd05f Changed integer storage from positive/negative to signed/unsigned 2021-04-14 11:45:01 +02:00
a002393716 Replaced donation link 2021-04-14 11:45:01 +02:00
a889f6560c Added VSCode settings 2021-04-14 11:43:51 +02:00
4db17ecd93 CI: format YAML file with Prettier 2021-04-08 09:46:01 +02:00
2a57f2b365 CI: fix installation of GCC and Clang 2021-04-08 09:45:04 +02:00
803e07c188 Updated folders list in .mbedignore (closes #1515) 2021-03-31 09:58:51 +02:00
ff44d93e68 Removed buggy blank line in CHANGELOG 2021-03-29 19:35:25 +02:00
d5d2209d09 Added "https://" prefix to all URLs so they are clickable in VS Code 2021-03-29 19:35:25 +02:00
c81e8fc93a README: added a link to ARDUINOJSON_ENABLE_ARDUINO_STREAM 2021-03-29 18:10:00 +02:00
347ac422f4 Added support for Printable (closes #1444) 2021-03-27 14:35:15 +01:00
d7f5b56ca4 Added support for custom converters (closes #687) 2021-03-20 14:52:47 +01:00
53d6f0d492 CI: Fixed build on Arduino 1.6.7 2021-03-19 11:50:29 +01:00
e4ce75e20c Simplified JsonVariant::as<T>() to always return T 2021-03-08 19:33:52 +01:00
9094179856 CI: added a clang-format job 2021-02-26 13:13:11 +01:00
3aab36fec2 Changed JsonVariantConst::is<JsonArray/JsonObject>() to return false (closes #1412) 2021-02-25 19:19:23 +01:00
744d61f6fd Added JsonVariant::is<JsonVariant/JsonVariantConst>() (issue #1412) 2021-02-23 08:41:24 +01:00
05498aa178 Added JsonVariant::is<JsonVariant>() (issue #1412) 2021-02-23 08:39:58 +01:00
b1eb273d5b Added JsonVariant::is<JsonArrayConst/JsonObjectConst>() (issue #1412) 2021-02-23 08:33:28 +01:00
8a3f8510d6 Simplified tests of JsonVariant::is<T>() 2021-02-23 08:27:48 +01:00
22904a48a6 Added a default implementation in the Visitor class 2021-02-21 13:37:07 +01:00
1730304f46 Funding: added paypal.me 2021-02-21 12:24:46 +01:00
1038fc35df Removed DeserializationError::NotSupported 2021-02-18 19:41:15 +01:00
71f44aaee1 deserializeMsgPack() inserts null instead of returning NotSupported 2021-02-18 19:40:25 +01:00
cc7ebfd11e deserializeJson() leaves \uXXXX instead of returning NotSupported 2021-02-18 19:40:11 +01:00
54d4b308f4 Remove JsonVariant::set(char) 2021-02-18 08:48:28 +01:00
5234c8124b Removed JsonVariant::as<char>() (fixes #1498) 2021-02-18 08:48:10 +01:00
e22d4bf31f Set version to 6.17.3 2021-02-15 09:53:10 +01:00
21f7b90f03 PlatformIO: set framework compatibility to * (closes #1490) 2021-02-15 09:49:56 +01:00
769e8440f5 CI: skip Particle job for Pull Requests 2021-02-05 13:00:56 +01:00
33de2b6cf3 Added GitHub sponsors 2021-02-05 12:03:50 +01:00
3975b07371 Moved CI from Travis to GitHub Actions (fixes #1493) 2021-02-03 21:33:18 +01:00
abd64102aa Fixed compilation error on Clang 10 2021-02-03 12:56:26 +01:00
d2174d1580 Fixed compilation error when isdigit() is a macro (fixes #1487) 2021-02-02 10:08:10 +01:00
c72eccdd35 Added missing calls to client.stop() in JsonHttpClient.ino (fixes #1485) 2021-02-01 09:16:23 +01:00
ab902128dc Upgrade to Lock Threads 2 2021-01-31 11:00:05 +01:00
c70a491f59 Made JsonDocument's destructor protected (fixes #1480) 2021-01-27 10:00:10 +01:00
322d13de0d Examples: add a note about performance issues with streams (#1476) 2021-01-25 09:26:29 +01:00
97b7161d78 Update copyright notice for 2021 2021-01-25 09:14:15 +01:00
1360b6a396 Set version to 6.17.2 2020-11-14 10:38:21 +01:00
16e51b83ab Changed the default value of ARDUINOJSON_ENABLE_PROGMEM (fixes #1433)
It now checks that the pgm_read_XXX macros are defined before enabling PROGMEM.
2020-11-10 14:58:31 +01:00
aa7cc5351c Travis: added smoke test for Particle Argon 2020-11-10 14:46:45 +01:00
30da920135 Fixed invalid conversion in operator|(Variant, char*) (fixes #1432) 2020-11-09 09:21:19 +01:00
bcdf5b7e52 Set version to 6.17.1 2020-11-07 10:11:41 +01:00
c711fe592d Allowed more than 32767 values in non-embedded mode (fixes #1414) 2020-10-28 09:59:40 +01:00
9d5c1b3742 Added an assert to detect too large variants (issue #1414) 2020-10-24 09:39:03 +02:00
6b26cd0977 Add JsonDocument to keywords.txt
see #1413
2020-10-24 09:37:16 +02:00
10ec0f21b0 Fixed operator|(MemberProxy, JsonObject) (fixes #1415) 2020-10-23 10:48:33 +02:00
ff66182dc6 Gathered the tests of MemberProxy in one file 2020-10-22 09:37:05 +02:00
d02ce2f1bb Gathered the tests of ElementProxy in one file 2020-10-22 09:37:05 +02:00
2664a2d0da Fixed error "ambiguous overload for operator|" (fixes #1411) 2020-10-22 09:30:31 +02:00
1f7350658e Set version to 6.17.0 2020-10-19 11:35:09 +02:00
41132b701b Fixed error "no matching function for pgm_read<double>()" on AVR 2020-10-17 14:02:26 +02:00
712005219c Added filtering for MessagePack (closes #1298, closes #1394) 2020-10-13 09:40:39 +02:00
0bd17aff8a Coverage: use -O0 instead of -Og 2020-10-11 15:10:52 +02:00
f3f44d7812 Renamed StdStringAdapter to StlStringAdapter (internal use only) 2020-10-01 10:01:33 +02:00
8385d5fa3a Added wildcard key (*) for filters (closes #1309) 2020-09-28 21:11:38 +02:00
726f8be341 Added operator|(JsonVariantConst, JsonVariantConst) 2020-09-26 14:48:17 +02:00
fee029b86e Moved float tables to PROGMEM 2020-09-19 16:12:49 +02:00
c3504ddf0a Added tests for DeserializationError::f_str() 2020-09-18 19:06:21 +02:00
6a878ee444 Fixed error "No such file or directory WString.h" (fixes #1381) 2020-09-16 10:29:20 +02:00
c4ec2ba88f Added DeserializationError::f_str() (issue #846) 2020-09-14 18:40:00 +02:00
c907ca6e5d Added DeserializationError::EmptyInput 2020-09-13 10:27:29 +02:00
8993a093e9 Travis: run sanitizer on recent GCC version to avoid false positives 2020-09-13 10:25:34 +02:00
d04669d0cc Fixed result of JsonVariant::set((char*)0) (fixes #1368) 2020-09-05 17:33:47 +02:00
05fc136915 Disabled memory sanitizer with clang 6 2020-09-05 13:44:40 +02:00
8d37939086 Added JsonDocument::overflowed() (closes #1358) 2020-09-05 13:44:40 +02:00
6d2ad4539f Simplified the implementation of parseNumber() 2020-09-04 09:23:40 +02:00
5ab53f42b2 Added a return value to visitors 2020-08-29 18:40:27 +02:00
f448e805e9 Removed dead code 2020-08-25 14:36:14 +02:00
67aa8efd5a Added a build failure when nullptr is defined as a macro (closes #1355) 2020-08-23 09:31:40 +02:00
562 changed files with 41544 additions and 24747 deletions

View File

@ -1,8 +1,12 @@
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
BasedOnStyle: Google
Standard: Cpp03
Standard: c++11
AllowShortFunctionsOnASingleLine: Empty
IncludeBlocks: Preserve
IndentPPDirectives: AfterHash
DerivePointerAlignment: false
# Always break after if to get accurate coverage
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false

View File

@ -0,0 +1,18 @@
{
"name": "Clang 10",
"image": "conanio/clang10",
"runArgs": [
"--name=ArduinoJson-clang10"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "Clang 11",
"image": "conanio/clang11",
"runArgs": [
"--name=ArduinoJson-clang11"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,5 @@
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y cmake git clang-13 libc++-13-dev libc++abi-13-dev
ENV CC=clang-13 CXX=clang++-13

View File

@ -0,0 +1,20 @@
{
"name": "Clang 13",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--name=ArduinoJson-clang13"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,5 @@
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y cmake git clang-14 libc++-14-dev libc++abi-14-dev
ENV CC=clang-14 CXX=clang++-14

View File

@ -0,0 +1,20 @@
{
"name": "Clang 14",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--name=ArduinoJson-clang14"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,5 @@
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y cmake git clang-15 libc++-15-dev libc++abi-15-dev
ENV CC=clang-15 CXX=clang++-15

View File

@ -0,0 +1,20 @@
{
"name": "Clang 15",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--name=ArduinoJson-clang15"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,5 @@
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y cmake git clang-16 libc++-16-dev libc++abi-16-dev
ENV CC=clang-16 CXX=clang++-16

View File

@ -0,0 +1,20 @@
{
"name": "Clang 16",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--name=ArduinoJson-clang16"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,5 @@
FROM ubuntu:24.04
RUN apt-get update
RUN apt-get install -y cmake git clang-17 libc++-17-dev libc++abi-17-dev
ENV CC=clang-17 CXX=clang++-17

View File

@ -0,0 +1,20 @@
{
"name": "Clang 17",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--name=ArduinoJson-clang17"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "Clang 5",
"image": "conanio/clang50",
"runArgs": [
"--name=ArduinoJson-clang5"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "Clang 6",
"image": "conanio/clang60",
"runArgs": [
"--name=ArduinoJson-clang6"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "Clang 7",
"image": "conanio/clang7",
"runArgs": [
"--name=ArduinoJson-clang7"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "Clang 8",
"image": "conanio/clang8",
"runArgs": [
"--name=ArduinoJson-clang8"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "Clang 9",
"image": "conanio/clang9",
"runArgs": [
"--name=ArduinoJson-clang9"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 10",
"image": "conanio/gcc10",
"runArgs": [
"--name=ArduinoJson-gcc10"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 11",
"image": "conanio/gcc11",
"runArgs": [
"--name=ArduinoJson-gcc11"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,4 @@
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y cmake git g++-12

View File

@ -0,0 +1,20 @@
{
"name": "GCC 12",
"build": {
"dockerfile": "Dockerfile",
},
"runArgs": [
"--name=ArduinoJson-gcc12"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,20 @@
{
"name": "GCC 4.8",
"image": "conanio/gcc48",
"runArgs": [
"--name=ArduinoJson-gcc48"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools",
"josetr.cmake-language-support-vscode",
"ms-vscode.cpptools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 5",
"image": "conanio/gcc5",
"runArgs": [
"--name=ArduinoJson-gcc5"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 6",
"image": "conanio/gcc6",
"runArgs": [
"--name=ArduinoJson-gcc6"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 7",
"image": "conanio/gcc7",
"runArgs": [
"--name=ArduinoJson-gcc7"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 8",
"image": "conanio/gcc8",
"runArgs": [
"--name=ArduinoJson-gcc8"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

View File

@ -0,0 +1,18 @@
{
"name": "GCC 9",
"image": "conanio/gcc9",
"runArgs": [
"--name=ArduinoJson-gcc9"
],
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools"
],
"settings": {
"cmake.generator": "Unix Makefiles",
"cmake.buildDirectory": "/tmp/build"
}
}
}
}

3
.gitattributes vendored
View File

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

5
.github/FUNDING.yml vendored
View File

@ -1 +1,4 @@
custom: https://arduinojson.org/book/
github: bblanchon
custom:
- https://arduinojson.org/book/
- https://donate.benoitblanchon.fr/

View File

@ -1,14 +0,0 @@
<!--
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!
-->

54
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,54 @@
---
name: 🐛 Bug report
about: Report a bug in ArduinoJson
title: ''
labels: 'bug'
assignees: ''
---
<!-- ⚠️ IMPORTANT ⚠️
Before opening a bug report, please use the ArduinoJson Troubleshooter as it may find a solution to your issue; if not, please include the Troubleshooter's report in the description.
-->
**Describe the bug**
A clear and concise description of what the bug is.
**Troubleshooter report**
Here is the report generated by the [ArduinoJson Troubleshooter](https://arduinojson.org/v7/troubleshooter/):
[Paste the report here]
**Environment**
Here is the environment that I used:
* Microcontroller: [e.g. ESP8266]
* Core/runtime: [e.g. ESP8266 core for Arduino v3.0.2]
* IDE: [e.g. Arduino IDE 1.8.16]
**Reproduction**
Here is a small snippet that reproduces the issue.
```c++
JsonDocument doc;
DeserializationError error = deserializeJson(doc, "{\"hello\":\"world\"}");
[insert repro code here]
```
**Compiler output**
If relevant, include the complete compiler output (i.e. not just the line that contains the error.)
**Program output**
If relevant, include the repro program output.
Expected output:
```
[insert expected output here]
```
Actual output:
```
[insert actual output here]
```

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: 👨‍🏫 ArduinoJson Assistant
url: https://arduinojson.org/v7/assistant/
about: An online tool that computes memory requirements and generates scaffolding code for your project.
- name: 👨‍⚕️ ArduinoJson Troubleshooter
url: https://arduinojson.org/v7/troubleshooter/
about: An online tool that helps you diagnose the most common issues with ArduinoJson.

View File

@ -0,0 +1,19 @@
---
name: 💡 Feature request
about: Suggest an idea for ArduinoJson
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

51
.github/ISSUE_TEMPLATE/help.md vendored Normal file
View File

@ -0,0 +1,51 @@
---
name: 😭 Help!
about: Ask for help
title: ''
labels: 'question'
assignees: ''
---
<!-- ⚠️ IMPORTANT ⚠️
Before asking for help, please use the ArduinoJson Troubleshooter as it may find a solution to your issue; if not, please include the Troubleshooter's report in the description.
-->
**Describe the issue**
A clear and concise description of what you're trying to do.
You don't need to explain every aspect of your project: focus on the problem you're having.
**Troubleshooter report**
Here is the report generated by the [ArduinoJson Troubleshooter](https://arduinojson.org/v7/troubleshooter/):
[Paste the report here]
**Environment**
Here is the environment that I'm using':
* Microconroller: [e.g. ESP8266]
* Core/runtime: [e.g. ESP8266 core for Arduino v3.0.2]
* IDE: [e.g. Arduino IDE 1.8.16]
**Reproduction**
Here is a small snippet that demonstrate the problem.
```c++
JsonDocument doc;
DeserializationError error = deserializeJson(doc, "{\"hello\":\"world\"}");
// insert code here
```
**Program output**
If relevant, include the program output.
Expected output:
```
[insert expected output here]
```
Actual output:
```
[insert actual output here]
```

7
.github/lock.yml vendored
View File

@ -1,7 +0,0 @@
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 30
# Comment to post before locking. Set to `false` to disable
lockComment: false

606
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,606 @@
name: Continuous Integration
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
name: Lint
runs-on: ubuntu-22.04
steps:
- name: Install
run: sudo apt-get install -y clang-format
- name: Checkout
uses: actions/checkout@v4
- name: Symlinks
run: find * -type l -printf "::error::%p is a symlink. This is forbidden by the Arduino Library Specification." -exec false {} +
- name: Clang-format
run: |
find src/ extras/ -name '*.[ch]pp' | xargs clang-format -i --verbose --style=file
git diff --exit-code
- name: Check URLs
run: |
grep -hREo "(http|https)://[a-zA-Z0-9./?=_%:-]*" src/ | sort -u | while read -r URL
do
STATUS=$(curl -s -o /dev/null -I -w "%{http_code}" "$URL")
[ "$STATUS" -ge 400 ] && echo "::warning title=HTTP $STATUS::$URL returned $STATUS"
done || true
gcc:
name: GCC
needs: lint
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
include:
- gcc: "4.8"
- gcc: "5"
- gcc: "6"
- gcc: "7"
cxxflags: -fsanitize=leak -fno-sanitize-recover=all
- gcc: "8"
cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
- gcc: "9"
cxxflags: -fsanitize=address -fno-sanitize-recover=all
- gcc: "10"
cxxflags: -funsigned-char # Issue #1715
- gcc: "11"
- gcc: "12"
steps:
- name: Workaround for actions/runner-images#9491
run: sudo sysctl vm.mmap_rnd_bits=28
- name: Install
run: |
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 3B4FE6ACC0B21F32
sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ xenial main universe'
sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ bionic main universe'
sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ focal main universe'
sudo apt-get update
sudo apt-get install -y gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
timeout-minutes: 5
- name: Checkout
uses: actions/checkout@v4
timeout-minutes: 1
- name: Configure
run: cmake -DCMAKE_BUILD_TYPE=Debug .
env:
CC: gcc-${{ matrix.gcc }}
CXX: g++-${{ matrix.gcc }}
CXXFLAGS: ${{ matrix.cxxflags }}
timeout-minutes: 1
- name: Build
run: cmake --build .
timeout-minutes: 10
- name: Test
run: ctest --output-on-failure -C Debug .
env:
UBSAN_OPTIONS: print_stacktrace=1
timeout-minutes: 2
clang:
name: Clang
needs: lint
strategy:
fail-fast: false
matrix:
include:
- clang: "3.9"
runner: ubuntu-20.04
archive: bionic
- clang: "4.0"
runner: ubuntu-20.04
archive: bionic
- clang: "5.0"
runner: ubuntu-20.04
archive: bionic
- clang: "6.0"
runner: ubuntu-20.04
archive: bionic
- clang: "7"
runner: ubuntu-20.04
- clang: "8"
cxxflags: -fsanitize=leak -fno-sanitize-recover=all
runner: ubuntu-20.04
- clang: "9"
cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
runner: ubuntu-20.04
- clang: "10"
cxxflags: -fsanitize=address -fno-sanitize-recover=all
runner: ubuntu-20.04
- clang: "11"
runner: ubuntu-22.04
- clang: "12"
runner: ubuntu-22.04
- clang: "13"
runner: ubuntu-22.04
- clang: "14"
runner: ubuntu-22.04
- clang: "15"
runner: ubuntu-22.04
runs-on: ${{ matrix.runner }}
steps:
- name: Add archive repositories
if: matrix.archive
run: |
sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ ${{ matrix.archive }} main'
sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ ${{ matrix.archive }} universe'
- name: Install Clang ${{ matrix.clang }}
run: |
sudo apt-get update
sudo apt-get install -y clang-${{ matrix.clang }}
- name: Install libc++ ${{ matrix.clang }}
if: matrix.clang >= 11
run: sudo apt-get install -y libc++-${{ matrix.clang }}-dev libc++abi-${{ matrix.clang }}-dev
- name: Install libunwind ${{ matrix.clang }}
if: matrix.clang == 12 # dependency is missing in Ubuntu 22.04
run: sudo apt-get install -y libunwind-${{ matrix.clang }}-dev
- name: Checkout
uses: actions/checkout@v4
- name: Configure
run: cmake -DCMAKE_BUILD_TYPE=Debug .
env:
CC: clang-${{ matrix.clang }}
CXX: clang++-${{ matrix.clang }}
CXXFLAGS: >-
${{ matrix.cxxflags }}
${{ matrix.clang < 11 && '-I/usr/lib/llvm-10/include/c++/v1/' || '' }}
- name: Build
run: cmake --build .
- name: Test
run: ctest --output-on-failure -C Debug .
env:
UBSAN_OPTIONS: print_stacktrace=1
conf_test:
name: Test configuration on Linux
needs: [gcc, clang]
runs-on: ubuntu-20.04
steps:
- name: Install
run: |
sudo apt-get update
sudo apt-get install -y g++-multilib gcc-avr avr-libc
- name: Checkout
uses: actions/checkout@v4
- name: AVR
run: avr-g++ -std=c++11 -Isrc extras/conf_test/avr.cpp
- name: GCC 32-bit
run: g++ -std=c++11 -m32 -Isrc extras/conf_test/x86.cpp
- name: GCC 64-bit
run: g++ -std=c++11 -m64 -Isrc extras/conf_test/x64.cpp
- name: Clang 32-bit
run: clang++ -std=c++11 -m32 -Isrc extras/conf_test/x86.cpp
- name: Clang 64-bit
run: clang++ -std=c++11 -m64 -Isrc extras/conf_test/x64.cpp
conf_test_windows:
name: Test configuration on Windows
runs-on: windows-2019
needs: [gcc, clang]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: 32-bit
run: |
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
cl /Isrc extras/conf_test/x86.cpp
shell: cmd
- name: 64-bit
run: |
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
cl /Isrc extras/conf_test/x64.cpp
shell: cmd
xcode:
name: XCode
needs: clang
runs-on: macos-13
strategy:
fail-fast: false
matrix:
include:
- xcode: "14.1"
- xcode: "14.2"
- xcode: "14.3.1"
- xcode: "15.0.1"
- xcode: "15.1"
- xcode: "15.2"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Select XCode version
run: sudo xcode-select --switch /Applications/Xcode_${{ matrix.xcode }}.app
- name: Configure
run: cmake -DCMAKE_BUILD_TYPE=Debug .
- name: Build
run: cmake --build .
- name: Test
run: ctest --output-on-failure -C Debug .
# DISABLED: Running on AppVeyor instead because it supports older versions of the compiler
# msvc:
# name: Visual Studio
# strategy:
# fail-fast: false
# matrix:
# include:
# - os: windows-2016
# - os: windows-2019
# runs-on: ${{ matrix.os }}
# steps:
# - name: Checkout
# uses: actions/checkout@v4
# - name: Configure
# run: cmake -DCMAKE_BUILD_TYPE=Debug .
# - name: Build
# run: cmake --build .
# - name: Test
# run: ctest --output-on-failure -C Debug .
arduino:
name: Arduino
needs: gcc
strategy:
fail-fast: false
matrix:
include:
- core: arduino:avr
board: arduino:avr:uno
- core: arduino:samd
board: arduino:samd:mkr1000
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install arduino-cli
run: curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=/usr/local/bin sh
- name: Install core
run: arduino-cli core install ${{ matrix.core }}
- name: Install libraries
run: arduino-cli lib install SD Ethernet
- name: Build JsonConfigFile
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonConfigFile/JsonConfigFile.ino"
- name: Build JsonFilterExample
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonFilterExample/JsonFilterExample.ino"
- name: Build JsonGeneratorExample
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonGeneratorExample/JsonGeneratorExample.ino"
- name: Build JsonHttpClient
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonHttpClient/JsonHttpClient.ino"
- name: Build JsonParserExample
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonParserExample/JsonParserExample.ino"
- name: Build JsonServer
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonServer/JsonServer.ino"
- name: Build JsonUdpBeacon
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonUdpBeacon/JsonUdpBeacon.ino"
- name: Build MsgPackParser
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/MsgPackParser/MsgPackParser.ino"
- name: Build ProgmemExample
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/ProgmemExample/ProgmemExample.ino"
- name: Build StringExample
run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/StringExample/StringExample.ino"
platformio:
name: PlatformIO
needs: gcc
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- platform: atmelavr
board: leonardo
libraries:
- SD
- Ethernet
conf_test: avr
- platform: espressif8266
board: huzzah
conf_test: esp8266
- platform: espressif32
board: esp32dev
libraries:
- Ethernet
conf_test: esp8266
- platform: atmelsam
board: mkr1000USB
libraries:
- SD
- Ethernet
conf_test: esp8266
- platform: teensy
board: teensy31
conf_test: esp8266
- platform: ststm32
board: adafruit_feather_f405
libraries:
- SD
- Ethernet
conf_test: esp8266
- platform: nordicnrf52
board: adafruit_feather_nrf52840
libraries:
- SD
- Ethernet
conf_test: esp8266
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up cache for pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip
- name: Set up Python 3.x
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install PlatformIO
run: pip install platformio
- name: Install adafruit-nrfutil
if: ${{ matrix.platform == 'nordicnrf52' }}
run: pip install adafruit-nrfutil
- name: Include Adafruit_TinyUSB.h # https://github.com/adafruit/Adafruit_nRF52_Arduino/issues/653
if: ${{ matrix.platform == 'nordicnrf52' }}
run: find examples/ -name '*.ino' -exec sed -i 's/\(#include <ArduinoJson.h>\)/\1\n#include <Adafruit_TinyUSB.h>/' {} +
- name: Set up cache for platformio
uses: actions/cache@v4
with:
path: ~/.platformio
key: ${{ runner.os }}-platformio-${{ matrix.platform }}
- name: Install platform "${{ matrix.platform }}"
run: platformio platform install ${{ matrix.platform }}
- name: Install libraries
if: ${{ matrix.libraries }}
run: platformio lib install arduino-libraries/${{ join(matrix.libraries, ' arduino-libraries/') }}
- name: Test configuration
run: platformio ci "extras/conf_test/${{ matrix.conf_test }}.cpp" -l '.' -b ${{ matrix.board }}
if: ${{ matrix.conf_test }}
- name: Build JsonConfigFile
run: platformio ci "examples/JsonConfigFile/JsonConfigFile.ino" -l '.' -b ${{ matrix.board }}
- name: Build JsonFilterExample
run: platformio ci "examples/JsonFilterExample/JsonFilterExample.ino" -l '.' -b ${{ matrix.board }}
- name: Build JsonGeneratorExample
run: platformio ci "examples/JsonGeneratorExample/JsonGeneratorExample.ino" -l '.' -b ${{ matrix.board }}
- name: Build JsonHttpClient
run: platformio ci "examples/JsonHttpClient/JsonHttpClient.ino" -l '.' -b ${{ matrix.board }}
- name: Build JsonParserExample
run: platformio ci "examples/JsonParserExample/JsonParserExample.ino" -l '.' -b ${{ matrix.board }}
- name: Build JsonServer
if: ${{ matrix.platform != 'espressif32' }}
run: platformio ci "examples/JsonServer/JsonServer.ino" -l '.' -b ${{ matrix.board }}
- name: Build JsonUdpBeacon
run: platformio ci "examples/JsonUdpBeacon/JsonUdpBeacon.ino" -l '.' -b ${{ matrix.board }}
- name: Build MsgPackParser
run: platformio ci "examples/MsgPackParser/MsgPackParser.ino" -l '.' -b ${{ matrix.board }}
- name: Build ProgmemExample
run: platformio ci "examples/ProgmemExample/ProgmemExample.ino" -l '.' -b ${{ matrix.board }}
- name: Build StringExample
run: platformio ci "examples/StringExample/StringExample.ino" -l '.' -b ${{ matrix.board }}
- name: PlatformIO prune
if: ${{ always() }}
run: platformio system prune -f
particle:
name: Particle
needs: gcc
runs-on: ubuntu-latest
if: github.event_name == 'push'
strategy:
fail-fast: false
matrix:
include:
- board: argon
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Particle CLI
run: sudo npm install -g particle-cli
- name: Login to Particle
run: particle login -t "${{ secrets.PARTICLE_TOKEN }}"
- name: Compile
run: extras/ci/particle.sh ${{ matrix.board }}
arm:
name: GCC for ARM processor
needs: gcc
runs-on: ubuntu-20.04
steps:
- name: Install
run: |
sudo apt-get update
sudo apt-get install -y g++-arm-linux-gnueabihf
- name: Checkout
uses: actions/checkout@v4
- name: Configure
run: cmake .
env:
CC: arm-linux-gnueabihf-gcc
CXX: arm-linux-gnueabihf-g++
- name: Build
run: cmake --build .
coverage:
needs: gcc
name: Coverage
runs-on: ubuntu-20.04
steps:
- name: Install
run: sudo apt-get install -y lcov ninja-build
- name: Checkout
uses: actions/checkout@v4
- name: Configure
run: cmake -G Ninja -DCOVERAGE=true .
- name: Build
run: ninja
- name: Test
run: ctest --output-on-failure -LE 'WillFail|Fuzzing' -T test
- name: lcov --capture
run: lcov --capture --no-external --directory . --output-file coverage.info
- name: lcov --remove
run: lcov --remove coverage.info "$(pwd)/extras/*" --output-file coverage_filtered.info
- name: genhtml
run: mkdir coverage && genhtml coverage_filtered.info -o coverage -t ArduinoJson
- name: Upload HTML report
uses: actions/upload-artifact@v4
with:
name: Coverage report
path: coverage
- name: Upload to Coveralls
uses: coverallsapp/github-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-lcov: coverage_filtered.info
valgrind:
needs: gcc
name: Valgrind
runs-on: ubuntu-20.04
steps:
- name: Install
run: |
sudo apt-get update
sudo apt-get install -y valgrind ninja-build
- name: Checkout
uses: actions/checkout@v4
- name: Configure
run: cmake -G Ninja -D MEMORYCHECK_COMMAND_OPTIONS="--error-exitcode=1 --leak-check=full" .
- name: Build
run: ninja
- name: Memcheck
run: ctest --output-on-failure -LE WillFail -T memcheck
id: memcheck
- name: MemoryChecker.*.log
run: cat Testing/Temporary/MemoryChecker.*.log > $GITHUB_STEP_SUMMARY
if: failure()
clang-tidy:
needs: clang
name: Clang-Tidy
runs-on: ubuntu-20.04
steps:
- name: Install
run: sudo apt-get install -y clang-tidy cmake ninja-build
- name: Checkout
uses: actions/checkout@v4
- name: Configure
run: cmake -G Ninja -DCMAKE_CXX_CLANG_TIDY="clang-tidy-10;--warnings-as-errors=*" -DCMAKE_BUILD_TYPE=Debug .
env:
CC: clang-10
CXX: clang++-10
- name: Check
run: cmake --build . -- -k 0
amalgamate:
needs: gcc
name: Amalgamate ArduinoJson.h
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
else
VERSION=${GITHUB_SHA::7}
fi
echo "ARDUINOJSON_H=ArduinoJson-$VERSION.h" >> $GITHUB_ENV
echo "ARDUINOJSON_HPP=ArduinoJson-$VERSION.hpp" >> $GITHUB_ENV
- name: Amalgamate ArduinoJson.h
run: extras/scripts/build-single-header.sh "src/ArduinoJson.h" "$ARDUINOJSON_H"
- name: Amalgamate ArduinoJson.hpp
run: extras/scripts/build-single-header.sh "src/ArduinoJson.hpp" "$ARDUINOJSON_HPP"
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: Single headers
path: |
${{ env.ARDUINOJSON_H }}
${{ env.ARDUINOJSON_HPP }}
- name: Smoke test ArduinoJson.h
run: |
g++ -x c++ - <<END
#include "$ARDUINOJSON_H"
int main() {
JsonDocument doc;
deserializeJson(doc, "{}");
}
END
- name: Smoke test ArduinoJson.hpp
run: |
g++ -x c++ - <<END
#include "$ARDUINOJSON_HPP"
int main() {
ArduinoJson::JsonDocument doc;
deserializeJson(doc, "{}");
}
END
esp-idf:
needs: gcc
name: ESP-IDF
runs-on: ubuntu-latest
steps:
- name: Setup cache
uses: actions/cache@v4
with:
path: ~/.espressif
key: ${{ runner.os }}-esp-idf
- name: Checkout ArduinoJson
uses: actions/checkout@v4
- name: Checkout ESP-IDF
uses: actions/checkout@v4
with:
repository: espressif/esp-idf
path: esp-idf
submodules: true
- name: Install ESP-IDF
run: ./esp-idf/install.sh
- name: Add component
# NOTE: we cannot commit the symlink because the Arduino Library Specification forbids it.
run: |
mkdir -p extras/ci/espidf/components
ln -s $PWD extras/ci/espidf/components/ArduinoJson
- name: Build example
run: |
source esp-idf/export.sh
cd extras/ci/espidf
idf.py build
codeql:
name: CodeQL
runs-on: ubuntu-20.04
needs: gcc
permissions:
actions: read
contents: read
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: cpp
- name: Build
run: |
cmake -DCMAKE_BUILD_TYPE=Debug .
cmake --build .
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:cpp"

14
.github/workflows/lock.yml vendored Normal file
View File

@ -0,0 +1,14 @@
name: Lock Threads
on:
schedule:
- cron: '0 0 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-inactive-days: 30

93
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,93 @@
name: Release
on:
push:
tags:
- v*.*.*
jobs:
release:
name: Create release
runs-on: ubuntu-20.04
steps:
- name: Set variables
id: init
run: |
echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
- name: Checkout
uses: actions/checkout@v4
- name: Write release body
id: body
run: |
FILENAME=RELEASE.md
tee $FILENAME <<END
## Changes
$(extras/scripts/extract_changes.awk CHANGELOG.md)
[View version history](https://github.com/bblanchon/ArduinoJson/blob/${{ steps.init.outputs.tag }}/CHANGELOG.md)
END
echo "filename=$FILENAME" >> $GITHUB_OUTPUT
- name: Amalgamate ArduinoJson.h
id: amalgamate_h
run: |
FILENAME=ArduinoJson-${{ steps.init.outputs.tag }}.h
extras/scripts/build-single-header.sh src/ArduinoJson.h "$FILENAME"
echo "filename=$FILENAME" >> $GITHUB_OUTPUT
- name: Amalgamate ArduinoJson.hpp
id: amalgamate_hpp
run: |
FILENAME=ArduinoJson-${{ steps.init.outputs.tag }}.hpp
extras/scripts/build-single-header.sh src/ArduinoJson.hpp "$FILENAME"
echo "filename=$FILENAME" >> $GITHUB_OUTPUT
- name: Create release
uses: ncipollo/release-action@v1
with:
bodyFile: ${{ steps.body.outputs.filename }}
name: ArduinoJson ${{ steps.init.outputs.version }}
artifacts: ${{ steps.amalgamate_h.outputs.filename }},${{ steps.amalgamate_hpp.outputs.filename }}
token: ${{ secrets.GITHUB_TOKEN }}
idf:
name: IDF Component Registry
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Upload component to the component registry
uses: espressif/upload-components-ci-action@v1
with:
name: ArduinoJson
namespace: bblanchon
api_token: ${{ secrets.IDF_COMPONENT_API_TOKEN }}
particle:
name: Particle
runs-on: ubuntu-latest
steps:
- name: Install
run: npm install -g particle-cli
- name: Checkout
uses: actions/checkout@v4
- name: Login
run: particle login --token ${{ secrets.PARTICLE_TOKEN }}
- name: Publish
run: bash -eux extras/scripts/publish-particle-library.sh
platformio:
name: PlatformIO
runs-on: ubuntu-latest
steps:
- name: Set up Python 3.x
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install PlatformIO
run: pip install platformio
- name: Checkout
uses: actions/checkout@v4
- name: Publish
run: pio pkg publish --no-interactive --no-notify
env:
PLATFORMIO_AUTH_TOKEN: ${{ secrets.PLATFORMIO_AUTH_TOKEN }}

8
.gitignore vendored
View File

@ -10,3 +10,11 @@
/extras/fuzzing/*_fuzzer.options
/extras/fuzzing/*_fuzzer_seed_corpus.zip
.vs/
/out/
# Used by CI for Particle
/src/*.ino
/project.properties
# Used by IDF
/dist/

View File

@ -1,6 +1,4 @@
.devcontainer/
.github/
examples/
fuzzing/
scripts/
test/
third-party/
extras/

1
.prettierignore Normal file
View File

@ -0,0 +1 @@
*.md

View File

@ -1,136 +0,0 @@
sudo: false
language: cpp
matrix:
include:
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.4']
env: SCRIPT=test _CC=gcc-4.4 _CXX=g++-4.4
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.6']
env: SCRIPT=test _CC=gcc-4.6 _CXX=g++-4.6
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.7']
env: SCRIPT=test _CC=gcc-4.7 _CXX=g++-4.7
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.8']
env: SCRIPT=test _CC=gcc-4.8 _CXX=g++-4.8 SANITIZE=address
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-4.9']
env: SCRIPT=test _CC=gcc-4.9 _CXX=g++-4.9 SANITIZE=leak
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-5']
env: SCRIPT=test _CC=gcc-5 _CXX=g++-5 # SANITIZE=undefined
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-6']
env: SCRIPT=test _CC=gcc-6 _CXX=g++-6
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-7']
env: SCRIPT=test _CC=gcc-7 _CXX=g++-7
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-8']
env: SCRIPT=test _CC=gcc-8 _CXX=g++-8
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['g++-9']
env: SCRIPT=test _CC=gcc-9 _CXX=g++-9
- addons:
apt:
packages: ['g++-arm-linux-gnueabihf']
env: SCRIPT=build _CC=arm-linux-gnueabihf-gcc _CXX=arm-linux-gnueabihf-g++
- env: SCRIPT=test _CC=clang _CXX=clang++
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.5']
packages: ['clang-3.5']
env: SCRIPT=test _CC=clang-3.5 _CXX=clang++-3.5 SANITIZE=address
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.6']
packages: ['clang-3.6']
env: SCRIPT=test _CC=clang-3.6 _CXX=clang++-3.6 SANITIZE=leak
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.7']
packages: ['clang-3.7']
env: SCRIPT=test _CC=clang-3.7 _CXX=clang++-3.7
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.8']
packages: ['clang-3.8']
env: SCRIPT=test _CC=clang-3.8 _CXX=clang++-3.8 SANITIZE=undefined
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-trusty-3.9']
packages: ['clang-3.9']
env: SCRIPT=test _CC=clang-3.9 _CXX=clang++-3.9
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-trusty-4.0']
packages: ['clang-4.0']
env: SCRIPT=test _CC=clang-4.0 _CXX=clang++-4.0
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['clang-5.0']
env: SCRIPT=test _CC=clang-5.0 _CXX=clang++-5.0
- addons:
apt:
sources: ['ubuntu-toolchain-r-test']
packages: ['clang-6.0']
env: SCRIPT=test _CC=clang-6.0 _CXX=clang++-6.0
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-trusty-7']
packages: ['clang-7']
env: SCRIPT=test _CC=clang-7 _CXX=clang++-7
- addons:
apt:
sources: ['ubuntu-toolchain-r-test','llvm-toolchain-trusty-8']
packages: ['clang-8']
env: SCRIPT=test _CC=clang-8 _CXX=clang++-8
- addons:
apt:
sources:
- sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
packages: ['clang-9']
env: SCRIPT=test _CC=clang-9 _CXX=clang++-9
- env: SCRIPT=coverage
- os: osx
osx_image: xcode8.3
env: SCRIPT=test
- os: osx
osx_image: xcode9.4
env: SCRIPT=test
- os: osx
osx_image: xcode10
env: SCRIPT=test SANITIZE=address
- env: SCRIPT=arduino VERSION=1.6.7 BOARD=arduino:avr:uno
- env: SCRIPT=arduino VERSION=1.8.2 BOARD=arduino:samd:mkr1000
- env: SCRIPT=platformio BOARD=uno
- env: SCRIPT=platformio BOARD=esp01
cache:
directories:
- "~/.platformio"
- "extras/fuzzing/json_corpus"
- "extras/fuzzing/msgpack_corpus"
script: extras/ci/$SCRIPT.sh

17
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,17 @@
{
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"git.inputValidationLength": 80,
"git.inputValidationSubjectLength": 72,
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true,
"search.exclude": {
"/extras/tests/catch/*": true
},
"C_Cpp.default.includePath": [
"/src"
],
"[cmake]": {
"editor.detectIndentation": false,
"editor.insertSpaces": false,
}
}

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
#include "src/ArduinoJson.h"

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,19 @@
# ArduinoJson - arduinojson.org
# Copyright Benoit Blanchon 2014-2020
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.15)
project(ArduinoJson VERSION 6.16.1)
if(ESP_PLATFORM)
# Build ArduinoJson as an ESP-IDF component
idf_component_register(INCLUDE_DIRS src)
return()
endif()
project(ArduinoJson VERSION 7.3.0)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
include(CTest)
include(CTest)
endif()
add_subdirectory(src)

View File

@ -6,6 +6,5 @@ You can submit changes via GitHub Pull Requests.
Please:
1. Unit test every change in behavior
1. Update the test suite for any change of behavior
2. Use clang-format in "file" mode to format the code
3. Consider using the Continuous Integration (Travis and AppVeyor)

View File

@ -1,10 +1,10 @@
The MIT License (MIT)
---------------------
Copyright © 2014-2020 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.
The MIT License (MIT)
---------------------
Copyright © 2014-2025, 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.

129
README.md
View File

@ -1,55 +1,57 @@
![ArduinoJson](banner.svg)
<p align="center">
<a href="https://arduinojson.org/"><img alt="ArduinoJson" src="https://arduinojson.org/images/logo.svg" width="200" /></a>
</p>
---
[![arduino-library-badge](https://www.ardu-badge.com/badge/ArduinoJson.svg?version=6.16.1)](https://www.ardu-badge.com/ArduinoJson/6.16.1)
[![Build Status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/6.x?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x)
[![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=6.x)](https://travis-ci.org/bblanchon/ArduinoJson)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/bblanchon/ArduinoJson/ci.yml?branch=7.x&logo=github)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A7.x)
[![Continuous Integration](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/7.x?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/7.x)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
[![Coverage Status](https://coveralls.io/repos/github/bblanchon/ArduinoJson/badge.svg?branch=6.x)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x)
[![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat)](https://github.com/bblanchon/ArduinoJson/stargazers)
[![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/7.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=7.x)
[![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github&color=orange)](https://github.com/bblanchon/ArduinoJson/stargazers)
[![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github&color=orange)](https://github.com/sponsors/bblanchon)
ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).
## Features
* [JSON deserialization](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme)
* [Optionally decodes UTF-16 escape sequences to UTF-8](https://arduinojson.org/v6/api/config/decode_unicode/?utm_source=github&utm_medium=readme)
* [Optionally stores links to the input buffer (zero-copy)](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme)
* [Optionally supports comments in the input](https://arduinojson.org/v6/api/config/enable_comments/?utm_source=github&utm_medium=readme)
* [Optionally filters the input to keep only desired values](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme#filtering)
* [JSON deserialization](https://arduinojson.org/v7/api/json/deserializejson/)
* [Optionally decodes UTF-16 escape sequences to UTF-8](https://arduinojson.org/v7/api/config/decode_unicode/)
* [Optionally supports comments in the input](https://arduinojson.org/v7/api/config/enable_comments/)
* [Optionally filters the input to keep only desired values](https://arduinojson.org/v7/api/json/deserializejson/#filtering)
* Supports single quotes as a string delimiter
* Compatible with NDJSON and JSON Lines
* [JSON serialization](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme)
* [Can write to a buffer or a stream](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme)
* [Optionally indents the document (prettified JSON)](https://arduinojson.org/v6/api/json/serializejsonpretty/?utm_source=github&utm_medium=readme)
* [MessagePack serialization](https://arduinojson.org/v6/api/msgpack/serializemsgpack/?utm_source=github&utm_medium=readme)
* [MessagePack deserialization](https://arduinojson.org/v6/api/msgpack/deserializemsgpack/?utm_source=github&utm_medium=readme)
* Compatible with [NDJSON](http://ndjson.org/) and [JSON Lines](https://jsonlines.org/)
* [JSON serialization](https://arduinojson.org/v7/api/json/serializejson/)
* [Can write to a buffer or a stream](https://arduinojson.org/v7/api/json/serializejson/)
* [Optionally indents the document (prettified JSON)](https://arduinojson.org/v7/api/json/serializejsonpretty/)
* [MessagePack serialization](https://arduinojson.org/v7/api/msgpack/serializemsgpack/)
* [MessagePack deserialization](https://arduinojson.org/v7/api/msgpack/deserializemsgpack/)
* Efficient
* [Twice smaller than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme)
* [Almost 10% faster than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme)
* [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme)
* [Fixed memory allocation, no heap fragmentation](https://arduinojson.org/v6/api/jsondocument/?utm_source=github&utm_medium=readme)
* [Optionally works without heap memory (zero malloc)](https://arduinojson.org/v6/api/staticjsondocument/?utm_source=github&utm_medium=readme)
* Deduplicates strings
* [Twice smaller than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
* [Almost 10% faster than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
* [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
* [Deduplicates strings](https://arduinojson.org/news/2020/08/01/version-6-16-0/)
* Versatile
* [Supports custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v6/how-to/use-external-ram-on-esp32/?utm_source=github&utm_medium=readme)
* Supports [Arduino's `String`](https://arduinojson.org/v6/api/config/enable_arduino_string/) and [STL's `std::string`](https://arduinojson.org/v6/api/config/enable_std_string/?utm_source=github&utm_medium=readme)
* Supports Arduino's `Stream` and [STL's `std::istream`/`std::ostream`](https://arduinojson.org/v6/api/config/enable_std_stream/?utm_source=github&utm_medium=readme)
* [Supports Flash strings](https://arduinojson.org/v6/api/config/enable_progmem/?utm_source=github&utm_medium=readme)
* Supports [custom readers](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme#custom-reader) and [custom writers](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme#custom-writer)
* Supports [custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v7/how-to/use-external-ram-on-esp32/)
* Supports [`String`](https://arduinojson.org/v7/api/config/enable_arduino_string/), [`std::string`](https://arduinojson.org/v7/api/config/enable_std_string/), and [`std::string_view`](https://arduinojson.org/v7/api/config/enable_string_view/)
* Supports [`Stream`](https://arduinojson.org/v7/api/config/enable_arduino_stream/) and [`std::istream`/`std::ostream`](https://arduinojson.org/v7/api/config/enable_std_stream/)
* Supports [Flash strings](https://arduinojson.org/v7/api/config/enable_progmem/)
* Supports [custom readers](https://arduinojson.org/v7/api/json/deserializejson/#custom-reader) and [custom writers](https://arduinojson.org/v7/api/json/serializejson/#custom-writer)
* Supports [custom converters](https://arduinojson.org/news/2021/05/04/version-6-18-0/)
* Portable
* Usable on any C++ project (not limited to Arduino)
* Compatible with C++98
* Compatible with C++11, C++14 and C++17
* Support for C++98/C++03 available on [ArduinoJson 6.20.x](https://github.com/bblanchon/ArduinoJson/tree/6.20.x)
* Zero warnings with `-Wall -Wextra -pedantic` and `/W4`
* [Header-only library](https://en.wikipedia.org/wiki/Header-only)
* Works with virtually any board
* Arduino boards: [Uno](https://amzn.to/38aL2ik), [Due](https://amzn.to/36YkWi2), [Micro](https://amzn.to/35WkdwG), [Nano](https://amzn.to/2QTvwRX), [Mega](https://amzn.to/36XWhuf), [Yun](https://amzn.to/30odURc), [Leonardo](https://amzn.to/36XWjlR)...
* Espressif chips: [ESP8266](https://amzn.to/36YluV8), [ESP32](https://amzn.to/2G4pRCB)
* Lolin (WeMos) boards: [D1 mini](https://amzn.to/2QUpz7q), [D1 Mini Pro](https://amzn.to/36UsGSs)...
* Teensy boards: [4.0](https://amzn.to/30ljXGq), [3.2](https://amzn.to/2FT0EuC), [2.0](https://amzn.to/2QXUMXj)
* Teensy boards: [4.0](https://amzn.to/30ljXGq), [3.2](https://amzn.to/2FT0EuC), [2.0](https://amzn.to/2QXUMXj)
* Particle boards: [Argon](https://amzn.to/2FQHa9X), [Boron](https://amzn.to/36WgLUd), [Electron](https://amzn.to/30vEc4k), [Photon](https://amzn.to/387F9Cd)...
* Texas Instruments boards: [MSP430](https://amzn.to/30nJWgg)...
* Soft cores: [Nios II](https://en.wikipedia.org/wiki/Nios_II)...
* Tested on all major development environments
* [Arduino IDE](https://www.arduino.cc/en/Main/Software)
* [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/)
@ -58,35 +60,39 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).
* [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/)
* [Keil uVision](http://www.keil.com/)
* [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide)
* [Particle](https://www.particle.io/)
* [PlatformIO](http://platformio.org/)
* [Sloeber plugin for Eclipse](https://eclipse.baeyens.it/)
* [Visual Micro](http://www.visualmicro.com/)
* [Visual Studio](https://www.visualstudio.com/)
* [Even works with online compilers like wandbox.org](https://wandbox.org/permlink/t7KP7I6dVuLhqzDl)
* [CMake friendly](https://arduinojson.org/v6/how-to/use-arduinojson-with-cmake/?utm_source=github&utm_medium=readme)
* [Even works with online compilers like wandbox.org](https://wandbox.org/permlink/RlZSKy17DjJ6HcdN)
* [CMake friendly](https://arduinojson.org/v7/how-to/use-arduinojson-with-cmake/)
* Well designed
* [Elegant API](http://arduinojson.org/v6/example/?utm_source=github&utm_medium=readme)
* [Elegant API](http://arduinojson.org/v7/example/)
* [Thread-safe](https://en.wikipedia.org/wiki/Thread_safety)
* Self-contained (no external dependency)
* `const` friendly
* [`for` friendly](https://arduinojson.org/v6/api/jsonobject/begin_end/?utm_source=github&utm_medium=readme)
* [`for` friendly](https://arduinojson.org/v7/api/jsonobject/begin_end/)
* [TMP friendly](https://en.wikipedia.org/wiki/Template_metaprogramming)
* Handles [integer overflows](https://arduinojson.org/v6/api/jsonvariant/as/?utm_source=github&utm_medium=readme#integer-overflows)
* Handles [integer overflows](https://arduinojson.org/v7/api/jsonvariant/as/#integer-overflows)
* Well tested
* [Unit test coverage close to 100%](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x)
* [Unit test coverage close to 100%](https://coveralls.io/github/bblanchon/ArduinoJson?branch=7.x)
* Continuously tested on
* [Visual Studio 2010, 2012, 2013, 2015, 2017, 2019](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x)
* [GCC 4.4, 4.6, 4.7, 4.8, 4.9, 5, 6, 7, 8](https://travis-ci.org/bblanchon/ArduinoJson)
* [Clang 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 6.0, 7, 8](https://travis-ci.org/bblanchon/ArduinoJson)
* [Visual Studio 2017, 2019, 2022](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/7.x)
* [GCC 4.8, 5, 6, 7, 8, 9, 10, 11, 12](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22)
* [Clang 3.9, 4.0, 5.0, 6.0, 7, 8, 9, 10, 11, 12, 13, 14, 15](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22)
* [Continuously fuzzed with Google OSS Fuzz](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
* Passes all default checks of [clang-tidy](https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/clang-tidy/)
* Well documented
* [Tutorials](https://arduinojson.org/v6/doc/deserialization/?utm_source=github&utm_medium=readme)
* [Examples](https://arduinojson.org/v6/example/?utm_source=github&utm_medium=readme)
* [How-tos](https://arduinojson.org/v6/example/?utm_source=github&utm_medium=readme)
* [FAQ](https://arduinojson.org/v6/faq/?utm_source=github&utm_medium=readme)
* [Book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme)
* [Tutorials](https://arduinojson.org/v7/doc/deserialization/)
* [Examples](https://arduinojson.org/v7/example/)
* [How-tos](https://arduinojson.org/v7/example/)
* [FAQ](https://arduinojson.org/v7/faq/)
* [Troubleshooter](https://arduinojson.org/v7/troubleshooter/)
* [Book](https://arduinojson.org/book/)
* [Changelog](CHANGELOG.md)
* Vibrant user community
* Most popular of all Arduino libraries on [GitHub](https://github.com/search?o=desc&q=arduino+library&s=stars&type=Repositories) and [PlatformIO](https://platformio.org/lib/search)
* Most popular of all Arduino libraries on [GitHub](https://github.com/search?o=desc&q=arduino+library&s=stars&type=Repositories)
* [Used in hundreds of projects](https://www.hackster.io/search?i=projects&q=arduinojson)
* [Responsive support](https://github.com/bblanchon/ArduinoJson/issues?q=is%3Aissue+is%3Aclosed)
@ -97,9 +103,9 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).
Here is a program that parses a JSON document with ArduinoJson.
```c++
char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
const char* json = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
DynamicJsonDocument doc(1024);
JsonDocument doc;
deserializeJson(doc, json);
const char* sensor = doc["sensor"];
@ -108,14 +114,14 @@ double latitude = doc["data"][0];
double longitude = doc["data"][1];
```
See the [tutorial on arduinojson.org](https://arduinojson.org/doc/decoding/?utm_source=github&utm_medium=readme)
See the [tutorial on arduinojson.org](https://arduinojson.org/v7/doc/deserialization/)
### Serialization
Here is a program that generates a JSON document with ArduinoJson:
```c++
DynamicJsonDocument doc(1024);
JsonDocument doc;
doc["sensor"] = "gps";
doc["time"] = 1351824120;
@ -127,11 +133,26 @@ serializeJson(doc, Serial);
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
```
See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme)
See the [tutorial on arduinojson.org](https://arduinojson.org/v7/doc/serialization/)
## Support the project
## Sponsors
Do you like this library? Please [star this project on GitHub](https://github.com/bblanchon/ArduinoJson/stargazers)!
ArduinoJson is thankful to its sponsors. Please give them a visit; they deserve it!
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.
<p>
<a href="https://www.programmingelectronics.com/" rel="sponsored">
<img src="https://arduinojson.org/images/2021/10/programmingeleactronicsacademy.png" alt="Programming Electronics Academy" width="200">
</a>
</p>
<p>
<a href="https://github.com/1technophile" rel="sponsored">
<img alt="1technophile" src="https://avatars.githubusercontent.com/u/12672732?s=40&v=4">
</a>
<a href="https://github.com/LArkema" rel="sponsored">
<img alt="LArkema" src="https://avatars.githubusercontent.com/u/38381313?s=40&v=4">
</a>
</p>
If you run a commercial project that embeds ArduinoJson, think about [sponsoring the library's development](https://github.com/sponsors/bblanchon): it ensures the code that your products rely on stays actively maintained. It can also give your project some exposure to the makers' community.
If you are an individual user and want to support the development (or give a sign of appreciation), consider purchasing the book [Mastering ArduinoJson](https://arduinojson.org/book/)&nbsp;❤, or simply [cast a star](https://github.com/bblanchon/ArduinoJson/stargazers)&nbsp;⭐.

View File

@ -1,22 +1,28 @@
version: 6.16.1.{build}
version: 7.3.0.{build}
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
CMAKE_GENERATOR: Visual Studio 16 2019
- 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
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
CMAKE_GENERATOR: Visual Studio 17 2022
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
CMAKE_GENERATOR: Visual Studio 16 2019
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
CMAKE_GENERATOR: Visual Studio 15 2017
- CMAKE_GENERATOR: Ninja
MINGW32: i686-6.3.0-posix-dwarf-rt_v5-rev1 # MinGW-w64 6.3.0 i686
- CMAKE_GENERATOR: Ninja
MINGW64: x86_64-6.3.0-posix-seh-rt_v5-rev1 # MinGW-w64 6.3.0 x86_64
- CMAKE_GENERATOR: Ninja
MINGW64: x86_64-7.3.0-posix-seh-rt_v5-rev0 # MinGW-w64 7.3.0 x86_64
- CMAKE_GENERATOR: Ninja
MINGW64: x86_64-8.1.0-posix-seh-rt_v6-rev0 # MinGW-w64 8.1.0 x86_64
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%" .
- set PATH=%PATH:C:\Program Files\Git\usr\bin;=% # Workaround for CMake not wanting sh.exe on PATH for MinGW
- if defined MINGW set PATH=C:\%MINGW%\bin;%PATH%
- if defined MINGW32 set PATH=C:\mingw-w64\%MINGW32%\mingw32\bin;%PATH%
- if defined MINGW64 set PATH=C:\mingw-w64\%MINGW64%\mingw64\bin;%PATH%
- cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -G "%CMAKE_GENERATOR%" .
build_script:
- cmake --build . --config %CONFIGURATION%
- cmake --build . --config %CONFIGURATION%
test_script:
- ctest -C %CONFIGURATION% --output-on-failure .
- ctest -C %CONFIGURATION% --output-on-failure .

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 32 KiB

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to store your project configuration in a file.
@ -17,35 +17,28 @@
// * CLK <-> pin 13
// * CS <-> pin 4
//
// https://arduinojson.org/v6/example/config/
// https://arduinojson.org/v7/example/config/
#include <ArduinoJson.h>
#include <SD.h>
#include <SPI.h>
// Our configuration structure.
//
// Never use a JsonDocument to store the configuration!
// A JsonDocument is *not* a permanent storage; it's only a temporary storage
// used during the serialization phase. See:
// https://arduinojson.org/v6/faq/why-must-i-create-a-separate-config-object/
struct Config {
char hostname[64];
int port;
};
const char *filename = "/config.txt"; // <- SD library uses 8.3 filenames
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) {
void loadConfiguration(const char* filename, Config& config) {
// Open file for reading
File file = SD.open(filename);
// Allocate a temporary JsonDocument
// Don't forget to change the capacity to match your requirements.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<512> doc;
JsonDocument doc;
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, file);
@ -63,7 +56,7 @@ void loadConfiguration(const char *filename, Config &config) {
}
// Saves the configuration to a file
void saveConfiguration(const char *filename, const Config &config) {
void saveConfiguration(const char* filename, const Config& config) {
// Delete existing file, otherwise the configuration is appended to the file
SD.remove(filename);
@ -75,9 +68,7 @@ void saveConfiguration(const char *filename, const Config &config) {
}
// Allocate a temporary JsonDocument
// Don't forget to change the capacity to match your requirements.
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonDocument<256> doc;
JsonDocument doc;
// Set the values in the document
doc["hostname"] = config.hostname;
@ -93,7 +84,7 @@ void saveConfiguration(const char *filename, const Config &config) {
}
// Prints the content of a file to the Serial
void printFile(const char *filename) {
void printFile(const char* filename) {
// Open file for reading
File file = SD.open(filename);
if (!file) {
@ -114,7 +105,8 @@ void printFile(const char *filename) {
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Initialize SD library
const int chipSelect = 4;
@ -140,6 +132,12 @@ void loop() {
// not used in this example
}
// Performance issue?
// ------------------
//
// File is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/
// See also
// --------
//

View File

@ -1,20 +1,21 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to use DeserializationOpion::Filter
// This example shows how to use DeserializationOption::Filter
//
// https://arduinojson.org/v6/example/filter/
// https://arduinojson.org/v7/example/filter/
#include <ArduinoJson.h>
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// The huge input: an extract from OpenWeatherMap response
const __FlashStringHelper* input_json = F(
auto input_json = F(
"{\"cod\":\"200\",\"message\":0,\"list\":[{\"dt\":1581498000,\"main\":{"
"\"temp\":3.23,\"feels_like\":-3.63,\"temp_min\":3.23,\"temp_max\":4.62,"
"\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1010,\"humidity\":"
@ -33,12 +34,12 @@ void setup() {
"1000000,\"timezone\":0,\"sunrise\":1581492085,\"sunset\":1581527294}}");
// The filter: it contains "true" for each value we want to keep
StaticJsonDocument<200> filter;
JsonDocument filter;
filter["list"][0]["dt"] = true;
filter["list"][0]["main"]["temp"] = true;
// Deserialize the document
StaticJsonDocument<400> doc;
JsonDocument doc;
deserializeJson(doc, input_json, DeserializationOption::Filter(filter));
// Print the result

View File

@ -1,43 +1,32 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.
//
// https://arduinojson.org/v6/example/generator/
// https://arduinojson.org/v7/example/generator/
#include <ArduinoJson.h>
void setup() {
// Initialize Serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Allocate the JSON document
//
// Inside the brackets, 200 is the RAM allocated to this document.
// Don't forget to change this value to match your requirement.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<200> doc;
// StaticJsonObject allocates memory on the stack, it can be
// replaced by DynamicJsonDocument which allocates in the heap.
//
// DynamicJsonDocument doc(200);
JsonDocument doc;
// Add values in the document
//
doc["sensor"] = "gps";
doc["time"] = 1351824120;
// Add an array.
//
JsonArray data = doc.createNestedArray("data");
// Add an array
JsonArray data = doc["data"].to<JsonArray>();
data.add(48.756080);
data.add(2.302038);
// Generate the minified JSON and send it to the Serial port.
//
// Generate the minified JSON and send it to the Serial port
serializeJson(doc, Serial);
// The above line prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
@ -45,8 +34,7 @@ void setup() {
// Start a new line
Serial.println();
// Generate the prettified JSON and send it to the Serial port.
//
// Generate the prettified JSON and send it to the Serial port
serializeJsonPretty(doc, Serial);
// The above line prints:
// {

View File

@ -1,11 +1,11 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to parse a JSON document in an HTTP response.
// It uses the Ethernet library, but can be easily adapted for Wifi.
//
// It performs a GET resquest on arduinojson.org/example.json
// It performs a GET resquest on https://arduinojson.org/example.json
// Here is the expected response:
// {
// "sensor": "gps",
@ -16,7 +16,7 @@
// ]
// }
//
// https://arduinojson.org/v6/example/http-client/
// https://arduinojson.org/v7/example/http-client/
#include <ArduinoJson.h>
#include <Ethernet.h>
@ -25,7 +25,8 @@
void setup() {
// Initialize Serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Initialize Ethernet library
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
@ -53,6 +54,7 @@ void setup() {
client.println(F("Connection: close"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
client.stop();
return;
}
@ -63,6 +65,7 @@ void setup() {
if (strcmp(status + 9, "200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status);
client.stop();
return;
}
@ -70,25 +73,25 @@ void setup() {
char endOfHeaders[] = "\r\n\r\n";
if (!client.find(endOfHeaders)) {
Serial.println(F("Invalid response"));
client.stop();
return;
}
// Allocate the JSON document
// Use arduinojson.org/v6/assistant to compute the capacity.
const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60;
DynamicJsonDocument doc(capacity);
JsonDocument doc;
// Parse JSON object
DeserializationError error = deserializeJson(doc, client);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
Serial.println(error.f_str());
client.stop();
return;
}
// Extract values
Serial.println(F("Response:"));
Serial.println(doc["sensor"].as<char*>());
Serial.println(doc["sensor"].as<const char*>());
Serial.println(doc["time"].as<long>());
Serial.println(doc["data"][0].as<float>(), 6);
Serial.println(doc["data"][1].as<float>(), 6);
@ -101,6 +104,12 @@ void loop() {
// not used in this example
}
// Performance issue?
// ------------------
//
// EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/
// See also
// --------
//

View File

@ -1,52 +1,37 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to deserialize a JSON document with ArduinoJson.
//
// https://arduinojson.org/v6/example/parser/
// https://arduinojson.org/v7/example/parser/
#include <ArduinoJson.h>
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Allocate the JSON document
//
// Inside the brackets, 200 is the capacity of the memory pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<200> doc;
// StaticJsonDocument<N> allocates memory on the stack, it can be
// replaced by DynamicJsonDocument which allocates in the heap.
//
// DynamicJsonDocument doc(200);
JsonDocument doc;
// JSON input string.
//
// Using a char[], as shown here, enables the "zero-copy" mode. This mode uses
// the minimal amount of memory because the JsonDocument stores pointers to
// the input buffer.
// If you use another type of input, ArduinoJson must copy the strings from
// the input to the JsonDocument, so you need to increase the capacity of the
// JsonDocument.
char json[] =
const char* json =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, json);
// Test if parsing succeeds.
// Test if parsing succeeds
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
Serial.println(error.f_str());
return;
}
// Fetch values.
// Fetch the values
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do doc["time"].as<long>();
@ -55,7 +40,7 @@ void setup() {
double latitude = doc["data"][0];
double longitude = doc["data"][1];
// Print values.
// Print the values
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to implement an HTTP server that sends a JSON document
@ -13,7 +13,7 @@
// "digital": [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
// }
//
// https://arduinojson.org/v6/example/http-server/
// https://arduinojson.org/v7/example/http-server/
#include <ArduinoJson.h>
#include <Ethernet.h>
@ -25,7 +25,8 @@ EthernetServer server(80);
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Initialize Ethernet libary
if (!Ethernet.begin(mac)) {
@ -46,19 +47,20 @@ void loop() {
EthernetClient client = server.available();
// Do we have a client?
if (!client) return;
if (!client)
return;
Serial.println(F("New client"));
// Read the request (we ignore the content in this example)
while (client.available()) client.read();
while (client.available())
client.read();
// Allocate a temporary JsonDocument
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<500> doc;
JsonDocument doc;
// Create the "analog" array
JsonArray analogValues = doc.createNestedArray("analog");
JsonArray analogValues = doc["analog"].to<JsonArray>();
for (int pin = 0; pin < 6; pin++) {
// Read the analog input
int value = analogRead(pin);
@ -68,7 +70,7 @@ void loop() {
}
// Create the "digital" array
JsonArray digitalValues = doc.createNestedArray("digital");
JsonArray digitalValues = doc["digital"].to<JsonArray>();
for (int pin = 0; pin < 14; pin++) {
// Read the digital input
int value = digitalRead(pin);
@ -96,6 +98,12 @@ void loop() {
client.stop();
}
// Performance issue?
// ------------------
//
// EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/
// See also
// --------
//

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to send a JSON document to a UDP socket.
@ -17,7 +17,7 @@
// $ ncat -ulp 8888
// See https://nmap.org/ncat/
//
// https://arduinojson.org/v6/example/udp-beacon/
// https://arduinojson.org/v7/example/udp-beacon/
#include <ArduinoJson.h>
#include <Ethernet.h>
@ -32,7 +32,8 @@ EthernetUDP udp;
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Initialize Ethernet libary
if (!Ethernet.begin(mac)) {
@ -46,11 +47,10 @@ void setup() {
void loop() {
// Allocate a temporary JsonDocument
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<500> doc;
JsonDocument doc;
// Create the "analog" array
JsonArray analogValues = doc.createNestedArray("analog");
JsonArray analogValues = doc["analog"].to<JsonArray>();
for (int pin = 0; pin < 6; pin++) {
// Read the analog input
int value = analogRead(pin);
@ -60,7 +60,7 @@ void loop() {
}
// Create the "digital" array
JsonArray digitalValues = doc.createNestedArray("digital");
JsonArray digitalValues = doc["digital"].to<JsonArray>();
for (int pin = 0; pin < 14; pin++) {
// Read the digital input
int value = digitalRead(pin);
@ -86,6 +86,12 @@ void loop() {
delay(10000);
}
// Performance issue?
// ------------------
//
// EthernetUDP is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/
// See also
// --------
//

View File

@ -1,39 +1,24 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to deserialize a MessagePack document with
// ArduinoJson.
//
// https://arduinojson.org/v6/example/msgpack-parser/
// https://arduinojson.org/v7/example/msgpack-parser/
#include <ArduinoJson.h>
void setup() {
// Initialize serial port
Serial.begin(9600);
while (!Serial) continue;
while (!Serial)
continue;
// Allocate the JSON document
//
// Inside the brackets, 200 is the capacity of the memory pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<200> doc;
JsonDocument doc;
// StaticJsonObject allocates memory on the stack, it can be
// replaced by DynamicJsonObject which allocates in the heap.
//
// DynamicJsonObject doc(200);
// MessagePack input string.
//
// Using a char[], as shown here, enables the "zero-copy" mode. This mode uses
// the minimal amount of memory because the JsonDocument stores pointers to
// the input buffer.
// If you use another type of input, ArduinoJson must copy the strings from
// the input to the JsonDocument, so you need to increase the capacity of the
// JsonDocument.
// The MessagePack input string
uint8_t input[] = {131, 166, 115, 101, 110, 115, 111, 114, 163, 103, 112, 115,
164, 116, 105, 109, 101, 206, 80, 147, 50, 248, 164, 100,
97, 116, 97, 146, 203, 64, 72, 96, 199, 58, 188, 148,
@ -45,16 +30,17 @@ void setup() {
// "data": [48.75608, 2.302038]
// }
// Parse the input
DeserializationError error = deserializeMsgPack(doc, input);
// Test if parsing succeeded.
// Test if parsing succeeded
if (error) {
Serial.print("deserializeMsgPack() failed: ");
Serial.println(error.c_str());
Serial.println(error.f_str());
return;
}
// Fetch values.
// Fetch the values
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do doc["time"].as<long>();
@ -63,7 +49,7 @@ void setup() {
double latitude = doc["data"][0];
double longitude = doc["data"][1];
// Print values.
// Print the values
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows the different ways you can use Flash strings with
@ -9,49 +9,40 @@
// JsonDocument. Prefer plain old char*, as they are more efficient in term of
// code size, speed, and memory usage.
//
// https://arduinojson.org/v6/example/progmem/
// https://arduinojson.org/v7/example/progmem/
#include <ArduinoJson.h>
void setup() {
#ifdef PROGMEM // <- check that Flash strings are supported
DynamicJsonDocument doc(1024);
JsonDocument doc;
// You can use a Flash String as your JSON input.
// WARNING: the strings in the input will be duplicated in the JsonDocument.
deserializeJson(doc, F("{\"sensor\":\"gps\",\"time\":1351824120,"
"\"data\":[48.756080,2.302038]}"));
JsonObject obj = doc.as<JsonObject>();
// You can use a Flash String to get an element of a JsonObject
// You can use a Flash String as a key to get a member from JsonDocument
// No duplication is done.
long time = obj[F("time")];
long time = doc[F("time")];
// You can use a Flash String to set an element of a JsonObject
// You can use a Flash String as a key to set a member of a JsonDocument
// WARNING: the content of the Flash String will be duplicated in the
// JsonDocument.
obj[F("time")] = time;
doc[F("time")] = time;
// You can set a Flash String to a JsonObject or JsonArray:
// You can set a Flash String as the content of a JsonVariant
// WARNING: the content of the Flash String will be duplicated in the
// JsonDocument.
obj["sensor"] = F("gps");
doc["sensor"] = F("gps");
// It works with serialized() too:
obj["sensor"] = serialized(F("\"gps\""));
obj["sensor"] = serialized(F("\xA3gps"), 3);
doc["sensor"] = serialized(F("\"gps\""));
doc["sensor"] = serialized(F("\xA3gps"), 3);
// You can compare the content of a JsonVariant to a Flash String
if (obj["sensor"] == F("gps")) {
if (doc["sensor"] == F("gps")) {
// ...
}
#else
#warning PROGMEM is not supported on this platform
#endif
}
void loop() {

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows the different ways you can use String with ArduinoJson.
@ -8,50 +8,49 @@
// JsonDocument. Prefer plain old char[], as they are more efficient in term of
// code size, speed, and memory usage.
//
// https://arduinojson.org/v6/example/string/
// https://arduinojson.org/v7/example/string/
#include <ArduinoJson.h>
void setup() {
DynamicJsonDocument doc(1024);
JsonDocument doc;
// You can use a String as your JSON input.
// WARNING: the string in the input will be duplicated in the JsonDocument.
String input =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
deserializeJson(doc, input);
JsonObject obj = doc.as<JsonObject>();
// You can use a String to get an element of a JsonObject
// You can use a String as a key to get a member from JsonDocument
// No duplication is done.
long time = obj[String("time")];
long time = doc[String("time")];
// You can use a String to set an element of a JsonObject
// You can use a String as a key to set a member of a JsonDocument
// WARNING: the content of the String will be duplicated in the JsonDocument.
obj[String("time")] = time;
doc[String("time")] = time;
// You can get a String from a JsonObject or JsonArray:
// You can get the content of a JsonVariant as a String
// No duplication is done, at least not in the JsonDocument.
String sensor = obj["sensor"];
String sensor = doc["sensor"];
// Unfortunately, the following doesn't work (issue #118):
// sensor = obj["sensor"]; // <- error "ambiguous overload for 'operator='"
// sensor = doc["sensor"]; // <- error "ambiguous overload for 'operator='"
// As a workaround, you need to replace by:
sensor = obj["sensor"].as<String>();
sensor = doc["sensor"].as<String>();
// You can set a String to a JsonObject or JsonArray:
// You can set a String as the content of a JsonVariant
// WARNING: the content of the String will be duplicated in the JsonDocument.
obj["sensor"] = sensor;
doc["sensor"] = sensor;
// It works with serialized() too:
obj["sensor"] = serialized(sensor);
doc["sensor"] = serialized(sensor);
// You can also concatenate strings
// WARNING: the content of the String will be duplicated in the JsonDocument.
obj[String("sen") + "sor"] = String("gp") + "s";
doc[String("sen") + "sor"] = String("gp") + "s";
// You can compare the content of a JsonObject with a String
if (obj["sensor"] == sensor) {
if (doc["sensor"] == sensor) {
// ...
}

View File

@ -1,3 +1,7 @@
if(NOT DEFINED COVERAGE)
set(COVERAGE OFF)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
add_compile_options(
-pedantic
@ -18,28 +22,32 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
-Wparentheses
-Wredundant-decls
-Wshadow
-Wsign-conversion
-Wsign-promo
-Wstrict-aliasing
-Wundef
)
if(NOT MINGW)
add_compile_options(
-std=c++98
)
endif()
if(${COVERAGE})
set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage")
endif()
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9) AND(NOT ${COVERAGE}))
add_compile_options(-g -Og)
else()
add_compile_options(-g -O0)
else() # GCC 4.8
add_compile_options(
-g
-O0 # GCC 4.8 doesn't support -Og
-Wno-shadow # allow the same name for a function parameter and a member functions
-Wp,-w # Disable preprocessing warnings (see below)
)
# GCC 4.8 doesn't support __has_include, so we need to help him
add_definitions(
-DARDUINOJSON_ENABLE_STD_STRING=1
-DARDUINOJSON_ENABLE_STD_STREAM=1
)
endif()
add_compile_options(
@ -70,7 +78,10 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.0)
add_compile_options(-stdlib=libc++)
link_libraries(c++ m)
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.0) AND(NOT ${COVERAGE}))
add_compile_options(-g -Og)
else()
add_compile_options(-g -O0)
@ -78,7 +89,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.0)
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.0) AND(NOT ${COVERAGE}))
add_compile_options(-g -Og)
else()
add_compile_options(-g -O0)
@ -90,11 +101,12 @@ if(MSVC)
add_compile_options(
/W4 # Set warning level
/WX # Treats all compiler warnings as errors.
/Zc:__cplusplus # Enable updated __cplusplus macro
)
if (NOT MSVC_VERSION LESS 1910) # >= Visual Studio 2017
add_compile_options(
/Zc:__cplusplus # Enable updated __cplusplus macro
)
endif()
endif()
if(MINGW)
# Static link on MinGW to avoid linking with the wrong DLLs when multiple
# versions are installed.
add_link_options(-static)
endif()

View File

@ -1,20 +0,0 @@
#!/bin/bash -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/
if [[ "$BOARD" =~ "arduino:samd:" ]]; then
arduino --install-boards arduino:samd
fi
ln -s $PWD /tmp/arduino/libraries/ArduinoJson
for EXAMPLE in $PWD/examples/*/*.ino; do
arduino --verify --board $BOARD $EXAMPLE
done

View File

@ -1,7 +0,0 @@
#!/bin/sh -ex
export CC="$_CC"
export CXX="$_CXX"
cmake -DCMAKE_BUILD_TYPE=Release .
cmake --build .

View File

@ -1,9 +0,0 @@
#!/bin/sh -eux
cmake -DCOVERAGE=true .
make
make test
pip install --user cpp-coveralls 'requests[security]'
pwd
coveralls --include 'src' --gcov-options '\-lp'

View File

@ -0,0 +1,8 @@
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(example)

View File

@ -0,0 +1,8 @@
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
idf_component_register(
SRCS "main.cpp"
INCLUDE_DIRS ""
)

View File

@ -0,0 +1,4 @@
#
# "main" pseudo-component makefile.
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)

View File

@ -0,0 +1,16 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
extern "C" void app_main() {
char buffer[256];
JsonDocument doc;
doc["hello"] = "world";
serializeJson(doc, buffer);
deserializeJson(doc, buffer);
serializeMsgPack(doc, buffer);
deserializeMsgPack(doc, buffer);
}

View File

@ -1,22 +0,0 @@
#!/bin/bash -eux
ROOT_DIR=$(dirname $0)/../../
FUZZING_DIR=${ROOT_DIR}/extras/fuzzing/
export CC="clang-${CLANG}"
export CXX="clang++-${CLANG}"
cmake -DCMAKE_BUILD_TYPE=Debug .
FUZZER_TARGET="${FUZZER}_fuzzer"
FUZZER_PATH="extras/fuzzing/${FUZZER_TARGET}"
CORPUS_DIR="${FUZZING_DIR}/${FUZZER}_corpus"
SEED_CORPUS_DIR="${FUZZING_DIR}/${FUZZER}_seed_corpus"
cmake --build . --target $FUZZER_TARGET
export ASAN_OPTIONS="detect_leaks=0"
export LLVM_PROFILE_FILE="${FUZZER_TARGET}.profraw"
${FUZZER_PATH} "$CORPUS_DIR" "$SEED_CORPUS_DIR" -max_total_time=60 -timeout=1
llvm-profdata-${CLANG} merge -sparse ${LLVM_PROFILE_FILE} -o ${FUZZER_TARGET}.profdata
llvm-cov-${CLANG} report ./${FUZZER_PATH} -instr-profile=${FUZZER_TARGET}.profdata

10
extras/ci/particle.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh -ex
BOARD=$1
cd "$(dirname "$0")/../../"
cp extras/particle/src/smocktest.ino src/
cp extras/particle/project.properties ./
particle compile "$BOARD"

View File

@ -1,20 +0,0 @@
#!/bin/sh -eux
pip install --user platformio
case $BOARD in
uno)
platformio lib install 868 # SD library
platformio lib install 872 # Ethernet library
;;
esp01)
platformio lib uninstall 161 || true
platformio lib uninstall 868 || true
platformio lib uninstall 872 || true
;;
esac
for EXAMPLE in $PWD/examples/*/*.ino;
do
platformio ci $EXAMPLE -l '.' -b $BOARD
done

View File

@ -1,10 +0,0 @@
#!/bin/sh -ex
export CC="$_CC"
export CXX="$_CXX"
[ -n "$SANITIZE" ] && export CXXFLAGS="-fsanitize=$SANITIZE"
cmake -DCMAKE_BUILD_TYPE=Debug .
cmake --build .
ctest --output-on-failure .

18
extras/conf_test/avr.cpp Normal file
View File

@ -0,0 +1,18 @@
#include <ArduinoJson.h>
static_assert(ARDUINOJSON_ENABLE_PROGMEM == 1, "ARDUINOJSON_ENABLE_PROGMEM");
static_assert(ARDUINOJSON_USE_LONG_LONG == 0, "ARDUINOJSON_USE_LONG_LONG");
static_assert(ARDUINOJSON_SLOT_ID_SIZE == 1, "ARDUINOJSON_SLOT_ID_SIZE");
static_assert(ARDUINOJSON_POOL_CAPACITY == 16, "ARDUINOJSON_POOL_CAPACITY");
static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");
static_assert(ARDUINOJSON_USE_DOUBLE == 0, "ARDUINOJSON_USE_DOUBLE");
static_assert(ArduinoJson::detail::ResourceManager::slotSize == 6, "slot size");
void setup() {}
void loop() {}

View File

@ -0,0 +1,16 @@
#include <ArduinoJson.h>
static_assert(ARDUINOJSON_USE_LONG_LONG == 1, "ARDUINOJSON_USE_LONG_LONG");
static_assert(ARDUINOJSON_SLOT_ID_SIZE == 2, "ARDUINOJSON_SLOT_ID_SIZE");
static_assert(ARDUINOJSON_POOL_CAPACITY == 128, "ARDUINOJSON_POOL_CAPACITY");
static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");
static_assert(ARDUINOJSON_USE_DOUBLE == 1, "ARDUINOJSON_USE_DOUBLE");
static_assert(ArduinoJson::detail::ResourceManager::slotSize == 8, "slot size");
void setup() {}
void loop() {}

16
extras/conf_test/x64.cpp Normal file
View File

@ -0,0 +1,16 @@
#include <ArduinoJson.h>
static_assert(ARDUINOJSON_USE_LONG_LONG == 1, "ARDUINOJSON_USE_LONG_LONG");
static_assert(ARDUINOJSON_SLOT_ID_SIZE == 4, "ARDUINOJSON_SLOT_ID_SIZE");
static_assert(ARDUINOJSON_POOL_CAPACITY == 256, "ARDUINOJSON_POOL_CAPACITY");
static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");
static_assert(ARDUINOJSON_USE_DOUBLE == 1, "ARDUINOJSON_USE_DOUBLE");
static_assert(ArduinoJson::detail::ResourceManager::slotSize == 16,
"slot size");
int main() {}

15
extras/conf_test/x86.cpp Normal file
View File

@ -0,0 +1,15 @@
#include <ArduinoJson.h>
static_assert(ARDUINOJSON_USE_LONG_LONG == 1, "ARDUINOJSON_USE_LONG_LONG");
static_assert(ARDUINOJSON_SLOT_ID_SIZE == 2, "ARDUINOJSON_SLOT_ID_SIZE");
static_assert(ARDUINOJSON_POOL_CAPACITY == 128, "ARDUINOJSON_POOL_CAPACITY");
static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");
static_assert(ARDUINOJSON_USE_DOUBLE == 1, "ARDUINOJSON_USE_DOUBLE");
static_assert(ArduinoJson::detail::ResourceManager::slotSize == 8, "slot size");
int main() {}

View File

@ -1,7 +1,10 @@
# ArduinoJson - arduinojson.org
# Copyright Benoit Blanchon 2014-2020
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(MSVC)
add_compile_options(-D_CRT_SECURE_NO_WARNINGS)
endif()
@ -22,11 +25,8 @@ target_link_libraries(json_reproducer
ArduinoJson
)
# Infer path of llvm-symbolizer from the path of clang
string(REPLACE "clang++" "llvm-symbolizer" LLVM_SYMBOLIZER ${CMAKE_CXX_COMPILER})
macro(add_fuzzer name mode)
set(FUZZER "${name}_${mode}_fuzzer")
macro(add_fuzzer name)
set(FUZZER "${name}_fuzzer")
set(CORPUS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}_corpus")
set(SEED_CORPUS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}_seed_corpus")
add_executable("${FUZZER}"
@ -36,38 +36,32 @@ macro(add_fuzzer name mode)
ArduinoJson
)
set_target_properties("${FUZZER}"
PROPERTIES
COMPILE_FLAGS
"-fprofile-instr-generate -fcoverage-mapping -fsanitize=${mode},fuzzer -fno-sanitize-recover=all"
LINK_FLAGS
"-fprofile-instr-generate -fcoverage-mapping -fsanitize=${mode},fuzzer -fno-sanitize-recover=all"
PROPERTIES
COMPILE_FLAGS "-fprofile-instr-generate -fcoverage-mapping -fsanitize=fuzzer -fno-sanitize-recover=all"
LINK_FLAGS "-fprofile-instr-generate -fcoverage-mapping -fsanitize=fuzzer -fno-sanitize-recover=all"
)
add_test(
NAME
"${FUZZER}"
COMMAND
"${FUZZER}" "${CORPUS_DIR}" "${SEED_CORPUS_DIR}" -max_total_time=5 -timeout=1
NAME "${FUZZER}"
COMMAND "${FUZZER}" "${CORPUS_DIR}" "${SEED_CORPUS_DIR}" -max_total_time=5 -timeout=1
)
set_tests_properties("${FUZZER}"
PROPERTIES
ENVIRONMENT
ASAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER}
ENVIRONMENT
LLVM_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER}
ENVIRONMENT
MSAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER}
ENVIRONMENT
UBSAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER}
LABELS "Fuzzing"
)
endmacro()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6)
add_fuzzer(json address)
add_fuzzer(json memory)
add_fuzzer(json undefined)
add_fuzzer(msgpack address)
add_fuzzer(msgpack memory)
add_fuzzer(msgpack undefined)
# Needs Clang 6+ to compile
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6)
if(DEFINED ENV{GITHUB_ACTIONS} AND CMAKE_CXX_COMPILER_VERSION MATCHES "^11\\.")
# Clang 11 fails on GitHub Actions with the following error:
# > ERROR: UndefinedBehaviorSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
# > Sanitizer CHECK failed: /build/llvm-toolchain-11-mnvtwk/llvm-toolchain-11-11.1.0/compiler-rt/lib/sanitizer_common/sanitizer_common.cpp:54 ((0 && "unable to mmap")) != (0) (0, 0)
message(WARNING "Fuzzing is disabled on GitHub Actions to workaround a bug in Clang 11")
return()
endif()
add_fuzzer(json)
add_fuzzer(msgpack)
endif()

View File

@ -1,6 +1,6 @@
# CAUTION: this file is invoked by https://github.com/google/oss-fuzz
CXXFLAGS += -I../../src -DARDUINOJSON_DEBUG=1
CXXFLAGS += -I../../src -DARDUINOJSON_DEBUG=1 -std=c++11
all: \
$(OUT)/json_fuzzer \

View File

@ -1,7 +1,7 @@
#include <ArduinoJson.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
DynamicJsonDocument doc(4096);
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, data, size);
if (!error) {
std::string json;

View File

@ -1,7 +1,7 @@
#include <ArduinoJson.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
DynamicJsonDocument doc(4096);
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
JsonDocument doc;
DeserializationError error = deserializeMsgPack(doc, data, size);
if (!error) {
std::string json;

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
// This file is NOT use by Google's OSS fuzz

View File

@ -0,0 +1 @@
name=ArduinoJsonCI

View File

@ -0,0 +1,5 @@
#include "ArduinoJson.h"
void setup() {}
void loop() {}

View File

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

View File

@ -2,11 +2,10 @@
set -e
TAG=$(git describe)
RE_RELATIVE_INCLUDE='^#include[[:space:]]*"(.*)"'
RE_ABSOLUTE_INCLUDE='^#include[[:space:]]*<(ArduinoJson/.*)>'
RE_SYSTEM_INCLUDE='^#include[[:space:]]*<(.*)>'
RE_EMPTY='^(#pragma[[:space:]]+once)?[[:space:]]*(//.*)?$'
RE_RELATIVE_INCLUDE='^#[[:space:]]*include[[:space:]]*"(.*)"'
RE_ABSOLUTE_INCLUDE='^#[[:space:]]*include[[:space:]]*<(ArduinoJson/.*)>'
RE_SYSTEM_INCLUDE='^#[[:space:]]*include[[:space:]]*<(.*)>'
RE_EMPTY='^(#[[:space:]]*pragma[[:space:]]+once)?[[:space:]]*(//.*)?$'
SRC_DIRECTORY="$(realpath "$(dirname $0)/../../src")"
@ -54,29 +53,13 @@ process()
}
simplify_namespaces() {
perl -p0i -e 's|\} // namespace ARDUINOJSON_NAMESPACE\r?\nnamespace ARDUINOJSON_NAMESPACE \{\r?\n||igs' "$1"
perl -p0i -e 's|ARDUINOJSON_END_PUBLIC_NAMESPACE\r?\nARDUINOJSON_BEGIN_PUBLIC_NAMESPACE\r?\n||igs' "$1"
perl -p0i -e 's|ARDUINOJSON_END_PRIVATE_NAMESPACE\r?\nARDUINOJSON_BEGIN_PRIVATE_NAMESPACE\r?\n||igs' "$1"
rm -f "$1.bak"
}
cd $(dirname $0)/../..
INCLUDED=()
process src/ArduinoJson.h true > ../ArduinoJson-$TAG.h
simplify_namespaces ../ArduinoJson-$TAG.h
g++ -x c++ -c -o ../smoketest.o - <<END
#include "../ArduinoJson-$TAG.h"
int main() {
StaticJsonDocument<300> doc;
deserializeJson(doc, "{}");
}
END
INCLUDED=()
process src/ArduinoJson.hpp true > ../ArduinoJson-$TAG.hpp
simplify_namespaces ../ArduinoJson-$TAG.hpp
g++ -x c++ -c -o ../smoketest.o - <<END
#include "../ArduinoJson-$TAG.hpp"
int main() {
ArduinoJson::StaticJsonDocument<300> doc;
ArduinoJson::deserializeJson(doc, "{}");
}
END
INPUT=$1
OUTPUT=$2
process "$INPUT" true > "$OUTPUT"
simplify_namespaces "$OUTPUT"

View File

@ -0,0 +1,29 @@
#!/usr/bin/awk -f
# Start echoing after the first list item
/\* / {
STARTED=1
EMPTY_LINE=0
}
# Remember if we have seen an empty line
/^[[:space:]]*$/ {
EMPTY_LINE=1
}
# Exit when seeing a new version number
/^v[[:digit:]]/ {
if (STARTED) exit
}
# Print if the line is not empty
# and restore the empty line we have skipped
!/^[[:space:]]*$/ {
if (STARTED) {
if (EMPTY_LINE) {
print ""
EMPTY_LINE=0
}
print
}
}

View File

@ -0,0 +1,18 @@
#!/bin/bash
set -eu
VERSION="$1"
CHANGELOG="$2"
ARDUINOJSON_H="$3"
cat << END
---
branch: v7
version: $VERSION
date: '$(date +'%Y-%m-%d')'
$(extras/scripts/wandbox/publish.sh "$ARDUINOJSON_H")
---
$(extras/scripts/extract_changes.awk "$CHANGELOG")
END

View File

@ -9,7 +9,7 @@ trap 'rm -rf "$WORK_DIR"' EXIT
cp "$SOURCE_DIR/README.md" "$WORK_DIR/README.md"
cp "$SOURCE_DIR/CHANGELOG.md" "$WORK_DIR/CHANGELOG.md"
cp "$SOURCE_DIR/library.properties" "$WORK_DIR/library.properties"
cp "$SOURCE_DIR/LICENSE.md" "$WORK_DIR/LICENSE.txt"
cp "$SOURCE_DIR/LICENSE.txt" "$WORK_DIR/LICENSE.txt"
cp -r "$SOURCE_DIR/src" "$WORK_DIR/"
cp -r "$SOURCE_DIR/examples" "$WORK_DIR/"

View File

@ -2,18 +2,26 @@
set -eu
which awk sed jq curl perl >/dev/null
cd "$(dirname "$0")/../.."
if ! git diff --quiet --exit-code; then
echo "Repository contains uncommitted changes"
exit
fi
VERSION="$1"
DATE=$(date +%F)
TAG="v$VERSION"
VERSION_REGEX="[0-9a-z\\.\\-]+"
VERSION_REGEX='[0-9]+\.[0-9]+\.[0-9]+(-[a-z0-9]+)?'
STARS=$(curl -s https://api.github.com/repos/bblanchon/ArduinoJson | jq '.stargazers_count')
update_version_in_source () {
IFS=".-" read MAJOR MINOR REVISION EXTRA < <(echo "$VERSION")
UNDERLINE=$(printf -- '-%.0s' $(seq 1 ${#TAG}))
sed -i~ -bE "s/version=$VERSION_REGEX/version=$VERSION/; s|ardu-badge.com/ArduinoJson/$VERSION_REGEX|ardu-badge.com/ArduinoJson/$VERSION|; " README.md
sed -i~ -bE "1,20{s/$VERSION_REGEX/$VERSION/g}" README.md
rm README.md~
sed -i~ -bE "4s/HEAD/$TAG ($DATE)/; 5s/-+/$UNDERLINE/" CHANGELOG.md
@ -22,26 +30,39 @@ update_version_in_source () {
sed -i~ -bE "s/(project\\s*\\(ArduinoJson\\s+VERSION\\s+).*?\\)/\\1$MAJOR.$MINOR.$REVISION)/" CMakeLists.txt
rm CMakeLists.txt~
sed -i~ -bE "s/\"version\":.*$/\"version\": \"$VERSION\",/" library.json
sed -i~ -bE \
-e "s/\"version\":.*$/\"version\": \"$VERSION\",/" \
-e "s/[0-9]+ stars/$STARS stars/" \
library.json
rm library.json~
sed -i~ -bE "s/version=.*$/version=$VERSION/" library.properties
sed -i~ -bE \
-e "s/version=.*$/version=$VERSION/" \
-e "s/[0-9]+ stars/$STARS stars/" \
library.properties
rm library.properties~
sed -i~ -bE "s/version: .*$/version: $VERSION.{build}/" appveyor.yml
rm appveyor.yml~
sed -i~ -bE \
-e "s/^version: .*$/version: \"$VERSION\"/" \
-e "s/[0-9]+ stars/$STARS stars/" \
idf_component.yml
rm idf_component.yml~
sed -i~ -bE \
-e "s/ARDUINOJSON_VERSION .*$/ARDUINOJSON_VERSION \"$VERSION\"/" \
-e "s/ARDUINOJSON_VERSION_MAJOR .*$/ARDUINOJSON_VERSION_MAJOR $MAJOR/" \
-e "s/ARDUINOJSON_VERSION_MINOR .*$/ARDUINOJSON_VERSION_MINOR $MINOR/" \
-e "s/ARDUINOJSON_VERSION_REVISION .*$/ARDUINOJSON_VERSION_REVISION $REVISION/" \
-e "s/ARDUINOJSON_VERSION_MACRO .*$/ARDUINOJSON_VERSION_MACRO V$MAJOR$MINOR$REVISION/" \
src/ArduinoJson/version.hpp
rm src/ArduinoJson/version.hpp*~
}
commit_new_version () {
git add src/ArduinoJson/version.hpp README.md CHANGELOG.md library.json library.properties appveyor.yml CMakeLists.txt
git add src/ArduinoJson/version.hpp README.md CHANGELOG.md library.json library.properties appveyor.yml CMakeLists.txt idf_component.yml
git commit -m "Set version to $VERSION"
}
@ -59,6 +80,8 @@ commit_new_version
add_tag
push
extras/scripts/build-arduino-package.sh
extras/scripts/build-single-header.sh
extras/scripts/wandbox/publish.sh "../ArduinoJson-$TAG.h"
extras/scripts/build-single-header.sh "src/ArduinoJson.h" "../ArduinoJson-$TAG.h"
extras/scripts/build-single-header.sh "src/ArduinoJson.hpp" "../ArduinoJson-$TAG.hpp"
extras/scripts/get-release-page.sh "$VERSION" "CHANGELOG.md" "../ArduinoJson-$TAG.h" > "../ArduinoJson-$TAG.md"
echo "You can now copy ../ArduinoJson-$TAG.md into arduinojson.org/collections/_versions/$VERSION.md"

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.
@ -9,35 +9,18 @@
int main() {
// Allocate the JSON document
//
// Inside the brackets, 200 is the RAM allocated to this document.
// Don't forget to change this value to match your requirement.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<200> doc;
JsonDocument doc;
// StaticJsonObject allocates memory on the stack, it can be
// replaced by DynamicJsonDocument which allocates in the heap.
//
// DynamicJsonDocument doc(200);
// StaticJsonObject allocates memory on the stack, it can be
// replaced by DynamicJsonDocument which allocates in the heap.
//
// DynamicJsonDocument doc(200);
// Add values in the document
//
// Add values in the document.
doc["sensor"] = "gps";
doc["time"] = 1351824120;
// Add an array.
//
JsonArray data = doc.createNestedArray("data");
// Add an array
JsonArray data = doc["data"].to<JsonArray>();
data.add(48.756080);
data.add(2.302038);
// Generate the minified JSON and send it to STDOUT
//
serializeJson(doc, std::cout);
// The above line prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
@ -46,7 +29,6 @@ int main() {
std::cout << std::endl;
// Generate the prettified JSON and send it to STDOUT
//
serializeJsonPretty(doc, std::cout);
// The above line prints:
// {

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to deserialize a JSON document with ArduinoJson.
@ -9,38 +9,22 @@
int main() {
// Allocate the JSON document
//
// Inside the brackets, 200 is the capacity of the memory pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<300> doc;
JsonDocument doc;
// StaticJsonDocument<N> allocates memory on the stack, it can be
// replaced by DynamicJsonDocument which allocates in the heap.
//
// DynamicJsonDocument doc(200);
// JSON input string.
//
// Using a char[], as shown here, enables the "zero-copy" mode. This mode uses
// the minimal amount of memory because the JsonDocument stores pointers to
// the input buffer.
// If you use another type of input, ArduinoJson must copy the strings from
// the input to the JsonDocument, so you need to increase the capacity of the
// JsonDocument.
char json[] =
// JSON input string
const char* json =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, json);
// Test if parsing succeeds.
// Test if parsing succeeds
if (error) {
std::cerr << "deserializeJson() failed: " << error.c_str() << std::endl;
return 1;
}
// Fetch values.
// Fetch the values
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do doc["time"].as<long>();
@ -49,7 +33,7 @@ int main() {
double latitude = doc["data"][0];
double longitude = doc["data"][1];
// Print values.
// Print the values
std::cout << sensor << std::endl;
std::cout << time << std::endl;
std::cout << latitude << std::endl;

View File

@ -1,5 +1,5 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2020
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.
@ -9,22 +9,9 @@
int main() {
// Allocate the JSON document
//
// Inside the brackets, 300 is the size of the memory pool in bytes.
// Don't forget to change this value to match your JSON document.
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonDocument<300> doc;
JsonDocument doc;
// StaticJsonObject allocates memory on the stack, it can be
// replaced by DynamicJsonObject which allocates in the heap.
//
// DynamicJsonObject doc(200);
// MessagePack 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.
// The MessagePack input string
uint8_t input[] = {131, 166, 115, 101, 110, 115, 111, 114, 163, 103, 112, 115,
164, 116, 105, 109, 101, 206, 80, 147, 50, 248, 164, 100,
97, 116, 97, 146, 203, 64, 72, 96, 199, 58, 188, 148,
@ -36,20 +23,16 @@ int main() {
// "data": [48.75608, 2.302038]
// }
// doc 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.
// Parse the input
DeserializationError error = deserializeMsgPack(doc, input);
// Test if parsing succeeds.
// Test if parsing succeeds
if (error) {
std::cerr << "deserializeMsgPack() failed: " << error.c_str() << std::endl;
return 1;
}
// Fetch values.
// Fetch the values
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do doc["time"].as<long>();
@ -58,7 +41,7 @@ int main() {
double latitude = doc["data"][0];
double longitude = doc["data"][1];
// Print values.
// Print the values
std::cout << sensor << std::endl;
std::cout << time << std::endl;
std::cout << latitude << std::endl;

View File

@ -14,14 +14,14 @@ compile() {
{
"code":$(read_string "$FILE_PATH"),
"codes": [{"file":"ArduinoJson.h","code":$(read_string "$ARDUINOJSON_H")}],
"options": "warning",
"compiler": "gcc-4.9.3",
"options": "warning,c++11",
"compiler": "gcc-head",
"save": true
}
END
URL=$(curl -sS -H "Content-type: application/json" -d @parameters.json https://wandbox.org/api/compile.json | jq --raw-output .url)
rm parameters.json
echo " $1: $URL"
[ -n "$URL" ] && echo "$1: $URL"
}
compile "JsonGeneratorExample"

1
extras/tests/.clang-tidy Normal file
View File

@ -0,0 +1 @@
Checks: '-clang-analyzer-security.insecureAPI.*'

View File

@ -1,23 +1,33 @@
# ArduinoJson - arduinojson.org
# Copyright Benoit Blanchon 2014-2020
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
add_subdirectory(catch)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
link_libraries(ArduinoJson catch)
link_libraries(ArduinoJson)
# Failing builds should only link with ArduinoJson, not catch
add_subdirectory(FailingBuilds)
add_subdirectory(catch)
link_libraries(catch)
include_directories(Helpers)
add_subdirectory(ElementProxy)
add_subdirectory(FailingBuilds)
add_subdirectory(Cpp17)
add_subdirectory(Cpp20)
add_subdirectory(Deprecated)
add_subdirectory(IntegrationTests)
add_subdirectory(JsonArray)
add_subdirectory(JsonArrayConst)
add_subdirectory(JsonDeserializer)
add_subdirectory(JsonDocument)
add_subdirectory(JsonObject)
add_subdirectory(JsonObjectConst)
add_subdirectory(JsonSerializer)
add_subdirectory(JsonVariant)
add_subdirectory(MemberProxy)
add_subdirectory(MemoryPool)
add_subdirectory(JsonVariantConst)
add_subdirectory(ResourceManager)
add_subdirectory(Misc)
add_subdirectory(MixedConfiguration)
add_subdirectory(MsgPackDeserializer)

View File

@ -0,0 +1,29 @@
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
if(MSVC_VERSION LESS 1910)
return()
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
return()
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7)
return()
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(Cpp17Tests
string_view.cpp
)
add_test(Cpp17 Cpp17Tests)
set_tests_properties(Cpp17
PROPERTIES
LABELS "Catch"
)

View File

@ -0,0 +1,113 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
// we expect ArduinoJson.h to include <string_view>
// but we don't want it to included accidentally
#undef ARDUINO
#define ARDUINOJSON_ENABLE_STD_STREAM 0
#define ARDUINOJSON_ENABLE_STD_STRING 0
#include <ArduinoJson.h>
#include <catch.hpp>
#include "Allocators.hpp"
#include "Literals.hpp"
#if !ARDUINOJSON_ENABLE_STRING_VIEW
# error ARDUINOJSON_ENABLE_STRING_VIEW must be set to 1
#endif
using ArduinoJson::detail::sizeofArray;
TEST_CASE("string_view") {
SpyingAllocator spy;
JsonDocument doc(&spy);
JsonVariant variant = doc.to<JsonVariant>();
SECTION("deserializeJson()") {
auto err = deserializeJson(doc, std::string_view("123", 2));
REQUIRE(err == DeserializationError::Ok);
REQUIRE(doc.as<int>() == 12);
}
SECTION("JsonDocument::set()") {
doc.set(std::string_view("123", 2));
REQUIRE(doc.as<std::string_view>() == "12");
}
SECTION("JsonDocument::operator[]() const") {
doc["ab"] = "Yes";
doc["abc"] = "No";
REQUIRE(doc[std::string_view("abc", 2)] == "Yes");
}
SECTION("JsonDocument::operator[]()") {
doc[std::string_view("abc", 2)] = "Yes";
REQUIRE(doc["ab"] == "Yes");
}
SECTION("JsonVariant::operator==()") {
variant.set("A");
REQUIRE(variant == std::string_view("AX", 1));
REQUIRE_FALSE(variant == std::string_view("BX", 1));
}
SECTION("JsonVariant::operator>()") {
variant.set("B");
REQUIRE(variant > std::string_view("AX", 1));
REQUIRE_FALSE(variant > std::string_view("CX", 1));
}
SECTION("JsonVariant::operator<()") {
variant.set("B");
REQUIRE(variant < std::string_view("CX", 1));
REQUIRE_FALSE(variant < std::string_view("AX", 1));
}
SECTION("String deduplication") {
doc.add(std::string_view("example one", 7));
doc.add(std::string_view("example two", 7));
doc.add(std::string_view("example\0tree", 12));
doc.add(std::string_view("example\0tree and a half", 12));
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("example")),
Allocate(sizeofString("example tree")),
});
}
SECTION("as<std::string_view>()") {
doc["s"] = "Hello World";
doc["i"] = 42;
REQUIRE(doc["s"].as<std::string_view>() == std::string_view("Hello World"));
REQUIRE(doc["i"].as<std::string_view>() == std::string_view());
}
SECTION("is<std::string_view>()") {
doc["s"] = "Hello World";
doc["i"] = 42;
REQUIRE(doc["s"].is<std::string_view>() == true);
REQUIRE(doc["i"].is<std::string_view>() == false);
}
SECTION("String containing NUL") {
doc.set("hello\0world"_s);
REQUIRE(doc.as<std::string_view>().size() == 11);
REQUIRE(doc.as<std::string_view>() == std::string_view("hello\0world", 11));
}
}
using ArduinoJson::detail::adaptString;
TEST_CASE("StringViewAdapter") {
std::string_view str("bravoXXX", 5);
auto adapter = adaptString(str);
CHECK(stringCompare(adapter, adaptString("alpha", 5)) > 0);
CHECK(stringCompare(adapter, adaptString("bravo", 5)) == 0);
CHECK(stringCompare(adapter, adaptString("charlie", 7)) < 0);
CHECK(adapter.size() == 5);
}

View File

@ -0,0 +1,29 @@
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License
if(MSVC_VERSION LESS 1910)
return()
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
return()
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
return()
endif()
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(Cpp20Tests
smoke_test.cpp
)
add_test(Cpp20 Cpp20Tests)
set_tests_properties(Cpp20
PROPERTIES
LABELS "Catch"
)

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