mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-06-28 10:51:01 +02:00
Compare commits
1774 Commits
v3.1
...
replace-ex
Author | SHA1 | Date | |
---|---|---|---|
53f858f55c | |||
6cdd59034d | |||
6ccac18fd4 | |||
3f6fff7d0c | |||
cc2fea45cd | |||
4159af66eb | |||
05942b620a | |||
23c73b061e | |||
c2e756d942 | |||
94aacf873e | |||
bd2dccda0e | |||
411424b74e | |||
5e5c287978 | |||
377cf63075 | |||
3252013509 | |||
deab127a2f | |||
96281de682 | |||
f0e84e4933 | |||
91397f9f06 | |||
7f75985e47 | |||
05b68fc7cc | |||
b06cee8f4d | |||
e03d8ae885 | |||
cb1dcfa5e4 | |||
67dd3120e6 | |||
9f3cf04415 | |||
01e49b33b7 | |||
8f7e793f37 | |||
254fa5712a | |||
de05814294 | |||
e33e78d202 | |||
ed5f890d28 | |||
8931651317 | |||
c078957282 | |||
cf084ae6b4 | |||
f02fcc96a2 | |||
594dc707cb | |||
5f8e3c0f0f | |||
afc0a29c2c | |||
a256ec7fff | |||
019e8326b7 | |||
bee1095042 | |||
de59dce527 | |||
57a9c50b38 | |||
5e7653b36a | |||
8110058729 | |||
7946ebe1a3 | |||
f9fe8557f1 | |||
e007d71b4f | |||
67a512a923 | |||
9cf4f3871d | |||
31253dbe13 | |||
1110d62128 | |||
c6c0649d70 | |||
61ec2c4f95 | |||
0dd6231b3f | |||
20219d74f0 | |||
64cbaa6ff7 | |||
2512993617 | |||
48ee4a178b | |||
cd4b2b2463 | |||
f806a42cc2 | |||
c1a507c158 | |||
a1809d0f31 | |||
d92eee8736 | |||
dd1d96e28f | |||
3b64197869 | |||
1f7a3f3174 | |||
fd6314e132 | |||
e4e2557b76 | |||
3b6bf45b8a | |||
65ba36622c | |||
33452c1f37 | |||
ee02c0d573 | |||
0278e94fce | |||
7643dadaec | |||
c0bebe35f1 | |||
b5bcb37657 | |||
b4a5b053ca | |||
e297932a98 | |||
e682337655 | |||
4ada3f849c | |||
5dd203bca4 | |||
362201241f | |||
2be24eded8 | |||
4327f72140 | |||
f7f1b9745d | |||
cec18177b0 | |||
f2894552f2 | |||
d3721cb122 | |||
ab72bb8601 | |||
09c89dcacf | |||
a2b09bfbd2 | |||
386105be90 | |||
83516e1740 | |||
bf99aeedb1 | |||
22dd4da3af | |||
55c3b9b3a7 | |||
d83515dcda | |||
e34c27723a | |||
b23ff65b99 | |||
556785dc1e | |||
e9c87858d1 | |||
208e7a3304 | |||
45611924f3 | |||
5b88b2c1f6 | |||
e4f3fd8c91 | |||
aec642be20 | |||
5a60c55be7 | |||
f99b2d63f9 | |||
1db803bcd3 | |||
04326d2655 | |||
9e0c56acc3 | |||
60f9f7eff6 | |||
0fe202af03 | |||
c41e8cc634 | |||
d486157a9e | |||
91aad55412 | |||
98fca74f66 | |||
60fb268d9a | |||
f1899d3049 | |||
4b779a7c1d | |||
5d1aa04e21 | |||
2f6db1edb0 | |||
aeb30ef307 | |||
1c5e5db071 | |||
68a13117dc | |||
071f718473 | |||
00949f8276 | |||
2c670e0148 | |||
002b07f0c5 | |||
5f5f927693 | |||
4d074840da | |||
82de20ee14 | |||
ece4d030a8 | |||
4d5c17b5f6 | |||
18a9a5b590 | |||
cd4bf33132 | |||
2cfefe22ac | |||
0d43e51d48 | |||
ef28064317 | |||
7c62cdb264 | |||
0ab4bdd691 | |||
af8c615266 | |||
bd13375729 | |||
5f8502ce9d | |||
1404b1ef70 | |||
36e1eecc7d | |||
ca2f80aeaf | |||
f17fc055d3 | |||
04ac53d114 | |||
483a2c9101 | |||
848c0cdc7e | |||
46a807bd30 | |||
cb0dc94db4 | |||
72642e3090 | |||
c98b05e207 | |||
2a87cc5839 | |||
296fe79bfd | |||
650d537b5d | |||
0435945a62 | |||
844a50296f | |||
1b143d383b | |||
94783fdd2a | |||
e41d5d4fa1 | |||
5dfa25d3dc | |||
a7bfc2212c | |||
315cc722e9 | |||
ca0dda7ac1 | |||
08cac13c43 | |||
44d2d47863 | |||
3571db6290 | |||
cc42373367 | |||
9dc43d14f3 | |||
3fa6b6e04f | |||
2d47b3931d | |||
0e8a236583 | |||
955815fbfa | |||
4cd03fbd26 | |||
f7dcea562f | |||
4774ca3d29 | |||
26b2ff4c0f | |||
7e6b89d21f | |||
d20e64187b | |||
86e06c901f | |||
6fe4b9c01d | |||
9b34069a3b | |||
30ea01bc31 | |||
92c9faf69f | |||
b20653ee1a | |||
750d53f8c7 | |||
7bd2ea1072 | |||
51c5f1a73a | |||
ac9b74df65 | |||
305e80c09d | |||
fc1f06822c | |||
a8c763c40e | |||
7ab6fc078c | |||
c98ba999af | |||
1d583f68da | |||
e93fd7657f | |||
78399c2d78 | |||
8cc645c40c | |||
11373af344 | |||
53d54ba9d7 | |||
2f31c932d7 | |||
93cb3d2fdc | |||
be5d5300a2 | |||
ea5b019552 | |||
bc6707b10c | |||
adea7f4131 | |||
7f459adc4b | |||
cdc1262127 | |||
f422b7b37d | |||
7a587ac2e2 | |||
38941d5807 | |||
57454cf97b | |||
af6954c224 | |||
3003756adb | |||
218a12ca46 | |||
752d01a7f1 | |||
43eed00cd9 | |||
bc8ea36781 | |||
8fb187baed | |||
db5b5f9ee2 | |||
9122d87f12 | |||
9a11d98117 | |||
30ec507989 | |||
7a76da3bc7 | |||
a8329564e2 | |||
00c9d8680a | |||
2fdacb1ca0 | |||
228c4cf9fa | |||
9d2d257851 | |||
5458e916ea | |||
1a14499612 | |||
f427706e06 | |||
8be0d57d24 | |||
8fcaebb44a | |||
bd2d232b40 | |||
b69a952e69 | |||
727a1013ca | |||
781e449e78 | |||
d4af8cffa7 | |||
0f3c73a211 | |||
0f319e7ca4 | |||
42b2840009 | |||
65c67d317a | |||
c4e5051a7a | |||
068c40d6ed | |||
c203c86a42 | |||
8aec448adf | |||
9538bc32af | |||
b2aa0029b9 | |||
57e9134540 | |||
fb4cb96c6c | |||
5e3f84c718 | |||
64922343e6 | |||
1d07abddcd | |||
21bf4973de | |||
da845ae01d | |||
5a9d3422f5 | |||
7a9feb4d6e | |||
39e8b63746 | |||
c37990d791 | |||
fac5b5a7a7 | |||
5ceb5d1813 | |||
ec4c73db0b | |||
f86b22cf4f | |||
78a74c4017 | |||
dae0182914 | |||
0f511b873d | |||
1d96826371 | |||
f6b014582f | |||
555f3dd5fe | |||
04973ca494 | |||
01b9b40bd2 | |||
c8517ee5b6 | |||
23b01a89b1 | |||
688e21e75f | |||
d921cd6d02 | |||
af8bdfbc8f | |||
68b1602c35 | |||
7bc73d7849 | |||
67bbb4c90d | |||
fffed4fba6 | |||
8d7bbffe10 | |||
488475fe16 | |||
ba8d102432 | |||
e96680eb29 | |||
4c0fb4eb55 | |||
db2fb01795 | |||
18ae8ab7b9 | |||
87c96f9306 | |||
262747b419 | |||
3e0ba2028c | |||
972f665b07 | |||
519e32badb | |||
d90b36c009 | |||
8147625921 | |||
2cf7fc5427 | |||
4871380060 | |||
2a663db3c7 | |||
437307a955 | |||
56b3b4d5a9 | |||
f5355a9eb5 | |||
779ee07de9 | |||
ab4e8547cb | |||
585795d002 | |||
68a167b167 | |||
78d4f721ff | |||
a97bcb6b2d | |||
2da1f2553d | |||
c267b55dec | |||
3a73ccf027 | |||
8ab45e6f82 | |||
da45c4bc4f | |||
48acf963fb | |||
ccccd1da11 | |||
78a30496be | |||
636c8c36eb | |||
5070fa6562 | |||
d9e035a288 | |||
aba8974148 | |||
044a4753d2 | |||
ff0deee793 | |||
37357086e2 | |||
9321f8fdab | |||
167ea08c53 | |||
5c0338970c | |||
6b4dd3ff2f | |||
fead19560c | |||
86772d33bc | |||
a035116018 | |||
806fa907ab | |||
95f5d9d134 | |||
03139a08af | |||
acfbf26e37 | |||
461cdaa818 | |||
dd46813dc0 | |||
5d796781fb | |||
f5e7570f84 | |||
003087406c | |||
b7c8e0d25c | |||
30c111fd3d | |||
9d0714efdf | |||
d8f3058efa | |||
7c0fa7c276 | |||
6eb4f45fb9 | |||
b3132cac3a | |||
d95a3bd19a | |||
22e4f216c3 | |||
e9850152a7 | |||
5e0e35615c | |||
c4b879645a | |||
6afa6b647c | |||
acd465b365 | |||
e858570afb | |||
0643c2e708 | |||
bcf1339e89 | |||
dc463a2f72 | |||
a7cdf638e7 | |||
57810af2ac | |||
2eb726b744 | |||
912137ccfb | |||
035c913c72 | |||
3f43c2b816 | |||
0328f66340 | |||
b3eada9c7f | |||
8516b368ad | |||
d0fff5a0b5 | |||
4c8d4b4e20 | |||
5faa3df43f | |||
540901e219 | |||
db9258bcd7 | |||
24aaab6e3e | |||
17a482a9b1 | |||
5edd435fe9 | |||
de9239caab | |||
c89a2025ce | |||
42ae8c3037 | |||
319ececf26 | |||
886254c41e | |||
4e7099dc73 | |||
26948cb83a | |||
0f8698e655 | |||
b2b995edb3 | |||
33a4773fbd | |||
daa87e12dc | |||
5abf512276 | |||
0dd4a68913 | |||
8971127b66 | |||
1b66a217bf | |||
34dd46110b | |||
8f7211a50f | |||
2be4ee732a | |||
3bdedc9a2f | |||
f699954f4d | |||
407fc2cd45 | |||
91fe6dcae8 | |||
62dea9d364 | |||
e0bdc4bff1 | |||
007b4f3362 | |||
94b2b3f9ce | |||
c2de812cbd | |||
669ee4dfe3 | |||
e054cba610 | |||
3d8287265c | |||
de7afc2015 | |||
ae0499fd57 | |||
b33966c755 | |||
d2cd13bf2e | |||
06b2263329 | |||
d4bb839ce9 | |||
6013a1a56f | |||
34b38e07c7 | |||
1ec16ca94f | |||
b350a96643 | |||
bf93779b4f | |||
dd0f7019ef | |||
175e5b3062 | |||
7885155634 | |||
1909ffe0f9 | |||
3345255f16 | |||
c49adfd6da | |||
5094b84a46 | |||
191fc5dff4 | |||
cb9c90f2d0 | |||
09f9bd6b8b | |||
67abbef818 | |||
7ed2559e9e | |||
ac8e5f01db | |||
396d2a7b3b | |||
de725e0a4e | |||
2a32803e9e | |||
d602232b9f | |||
b0730f04f7 | |||
ef8ed28aec | |||
b8eff868e6 | |||
d0b619ea93 | |||
652d70fe2c | |||
8228aec74b | |||
2f2e0e9415 | |||
3a9803679f | |||
dc42d93b0f | |||
dff07ebfe8 | |||
4c456a95a3 | |||
83e5d9d150 | |||
7079aa99d7 | |||
208a22e324 | |||
9afae963e8 | |||
1828dec658 | |||
afe2434baf | |||
e08f8d5b51 | |||
7e3b40f379 | |||
584770dc6f | |||
5d2a440c69 | |||
ac14f29e6c | |||
3d62fa8af2 | |||
0f85a55cac | |||
21db92af47 | |||
6447520b5b | |||
079ccadbee | |||
615f675840 | |||
2182c83b87 | |||
b8d1dccb21 | |||
c3d5e9382d | |||
ecb72f9a9d | |||
7004c39af6 | |||
057956225c | |||
b27990f780 | |||
61c6f8ba59 | |||
d8d37ba7ad | |||
92d6bae25c | |||
6e17c3e6f9 | |||
8ee67b0229 | |||
07b9153ae4 | |||
abfcac4674 | |||
cde8cd50f8 | |||
cf4436e581 | |||
2b6bb78a09 | |||
ffa7f8d22d | |||
f73be9cf0f | |||
8002722f3b | |||
62e83133cd | |||
1d21027e2a | |||
5705247e5f | |||
dde9e9fc26 | |||
a6da4ad452 | |||
e2a29eef24 | |||
043ee651a9 | |||
84b7037b3e | |||
c5838a876b | |||
750cd0be92 | |||
758580bfb6 | |||
04872b6db8 | |||
58c7c919f2 | |||
cd8373ad32 | |||
3b3ab8c4e1 | |||
5b06b1564e | |||
77b4270d97 | |||
7c2ca773ff | |||
e2bb2cec7b | |||
ff4e837df5 | |||
fb904033d3 | |||
e6cd16aec4 | |||
ee74c3bb1c | |||
37faa7ce13 | |||
3d6c328a4f | |||
5577d18377 | |||
1d103a1528 | |||
7b19a4b6e7 | |||
ac1d29fac0 | |||
98037e5742 | |||
d0e3808dd0 | |||
3760a643cb | |||
fc9d8aa31e | |||
ccfbb5fd1d | |||
c9fbc5e40a | |||
67b6797b6d | |||
8d9504239b | |||
bf5d0c790c | |||
f4379f97ae | |||
3dc67c5663 | |||
47f90b02c3 | |||
27c924746b | |||
7abf875071 | |||
e3e375f5cd | |||
ff06292d74 | |||
c1278797f2 | |||
421ecec0dd | |||
89ed54362b | |||
986f77fa15 | |||
f831ed395d | |||
a880614a75 | |||
ef8379df1b | |||
702f8c2e2f | |||
6806393285 | |||
dea8387586 | |||
6ea2815341 | |||
3c145f1782 | |||
21b2c76524 | |||
4f6244eef4 | |||
973858b835 | |||
ee12155617 | |||
4b4c68df5f | |||
fcae33d574 | |||
896f50eeb9 | |||
9693fd2d74 | |||
37f1c87338 | |||
4977de38fc | |||
9f4750637b | |||
0c65e13aa3 | |||
af18994deb | |||
8f9599cd19 | |||
78660c6e07 | |||
4f786db82d | |||
ad7b749dec | |||
29ba744d64 | |||
a2e1021d7d | |||
d20c3c65c8 | |||
8f029e6096 | |||
91ed68b4a6 | |||
67fc2d9897 | |||
055304bf01 | |||
c2800ace32 | |||
ec7ffa20f2 | |||
ada1f2a894 | |||
184a7c4fbd | |||
84e9447f12 | |||
ca073fda46 | |||
0f529a3587 | |||
e16767af92 | |||
3166356484 | |||
abdd9d81db | |||
3bf47761c8 | |||
f39d8f548f | |||
90d750e4d9 | |||
ca24ed48f5 | |||
51937778dd | |||
be70f6ddd7 | |||
a27398e445 | |||
43b2e2e774 | |||
62f9b94ab1 | |||
b06bbd9d2a | |||
2df1bc7d4f | |||
599e927590 | |||
0429016ff1 | |||
bd42b9638a | |||
b1a826b03a | |||
5ed5f3687b | |||
943a902a0b | |||
a7873389c6 | |||
acfa174333 | |||
8418845c8d | |||
df4a4b9e1d | |||
7f5497db55 | |||
e4658e963f | |||
7764515f56 | |||
7046c38c84 | |||
9e9bb30a57 | |||
41d1be24cc | |||
7d3b475e24 | |||
f82a227da6 | |||
fcd8159617 | |||
f51ccb5c3f | |||
e0cd5b6405 | |||
6a71f31820 | |||
3428ab1e89 | |||
956e4a7cbb | |||
669bad27d4 | |||
2c3ae1c181 | |||
f570fe8c37 | |||
1b74ad0731 | |||
6717700d3b | |||
b810833145 | |||
9d58e566fd | |||
6632fa8da1 | |||
5790f3c8f7 | |||
4073b52c00 | |||
f5c7a6478e | |||
ebf58320ca | |||
09ddb0f824 | |||
f02a699c26 | |||
67d0931c19 | |||
19d079c33c | |||
40723a4cc7 | |||
8a9a26588c | |||
219475630a | |||
52e856fa6f | |||
cb2c029e57 | |||
ef7579394b | |||
fc4f175300 | |||
a6fc9311b4 | |||
14639f129e | |||
9182c2068d | |||
cb1b3be723 | |||
5ccd62a789 | |||
145d45c746 | |||
f235157466 | |||
ba5cdab619 | |||
eab5ae2f07 | |||
2f0b3c0e63 | |||
4e261068a1 | |||
1d24caf066 | |||
dc76c5165f | |||
de11b36a98 | |||
c4a4ed5272 | |||
a24edac5a9 | |||
9dbf44388d | |||
6b8e93e05e | |||
6b5239b9d5 | |||
214c06b771 | |||
e32a8552be | |||
9bcb409648 | |||
3b10afd2ab | |||
af3bb131c8 | |||
622e7dd287 | |||
68082e6fc1 | |||
36bcc7b355 | |||
c7c0b729c1 | |||
6aeefda3b6 | |||
4780174ee1 | |||
ab23625091 | |||
a88cf8fab7 | |||
2be528a3fa | |||
337864618c | |||
526cad54d7 | |||
506cf7f438 | |||
4b89878c10 | |||
06fad301cb | |||
7be0c2c650 | |||
43f0db45ad | |||
892c37db08 | |||
d8a1d1a120 | |||
64e52e97ee | |||
2a777a659a | |||
898f429826 | |||
88fbe3ac34 | |||
4ddc674846 | |||
fc4f5fd05f | |||
a002393716 | |||
a889f6560c | |||
4db17ecd93 | |||
2a57f2b365 | |||
803e07c188 | |||
ff44d93e68 | |||
d5d2209d09 | |||
c81e8fc93a | |||
347ac422f4 | |||
d7f5b56ca4 | |||
53d6f0d492 | |||
e4ce75e20c | |||
9094179856 | |||
3aab36fec2 | |||
744d61f6fd | |||
05498aa178 | |||
b1eb273d5b | |||
8a3f8510d6 | |||
22904a48a6 | |||
1730304f46 | |||
1038fc35df | |||
71f44aaee1 | |||
cc7ebfd11e | |||
54d4b308f4 | |||
5234c8124b | |||
e22d4bf31f | |||
21f7b90f03 | |||
769e8440f5 | |||
33de2b6cf3 | |||
3975b07371 | |||
abd64102aa | |||
d2174d1580 | |||
c72eccdd35 | |||
ab902128dc | |||
c70a491f59 | |||
322d13de0d | |||
97b7161d78 | |||
1360b6a396 | |||
16e51b83ab | |||
aa7cc5351c | |||
30da920135 | |||
bcdf5b7e52 | |||
c711fe592d | |||
9d5c1b3742 | |||
6b26cd0977 | |||
10ec0f21b0 | |||
ff66182dc6 | |||
d02ce2f1bb | |||
2664a2d0da | |||
1f7350658e | |||
41132b701b | |||
712005219c | |||
0bd17aff8a | |||
f3f44d7812 | |||
8385d5fa3a | |||
726f8be341 | |||
fee029b86e | |||
c3504ddf0a | |||
6a878ee444 | |||
c4ec2ba88f | |||
c907ca6e5d | |||
8993a093e9 | |||
d04669d0cc | |||
05fc136915 | |||
8d37939086 | |||
6d2ad4539f | |||
5ab53f42b2 | |||
f448e805e9 | |||
67aa8efd5a | |||
61a5273aea | |||
35a39b8d8f | |||
96b6571352 | |||
74e7dd053f | |||
1f8636d762 | |||
e4cfa701d8 | |||
b85181a6db | |||
6841b80466 | |||
298864bafe | |||
4d7f03836c | |||
c63eb80b95 | |||
0c0bf80074 | |||
144ff3b06e | |||
d6c50c3596 | |||
51b177ce47 | |||
824b7a25ca | |||
2223d40640 | |||
4df29fbac1 | |||
6dc36125c2 | |||
40085609e2 | |||
ebb6d80092 | |||
764ff2cd53 | |||
8ef226bcb8 | |||
63606c0985 | |||
1600d39693 | |||
04c59985a1 | |||
7e58347fbe | |||
0e794a28a1 | |||
6fb52c3638 | |||
b72ef09451 | |||
f7de027617 | |||
bc4c2dde33 | |||
95f05dad66 | |||
3bb0a7aa8e | |||
dcf7eeef28 | |||
3b923b6e4e | |||
8050f7404b | |||
959b1d9e4c | |||
daa279d57b | |||
ae9b7926a2 | |||
1f7a5e6943 | |||
9e354803de | |||
3ea5eb3f3a | |||
ec43bf4fe9 | |||
2097ffaabf | |||
67e78f0751 | |||
1791dccbf2 | |||
40d1cfe7af | |||
4627f851ca | |||
fc9e609ab5 | |||
8b3d861a9d | |||
9ef864b27c | |||
275b80a462 | |||
763be4f266 | |||
5b812522fa | |||
9cb0ddb5e7 | |||
735bea1f47 | |||
0853b04589 | |||
c1b3705df1 | |||
2540b4e01b | |||
2641697e0b | |||
2996503b27 | |||
0214c9bcad | |||
a471aed6db | |||
af0edecddb | |||
300323cfd7 | |||
d8724e0a0b | |||
0001dabfd1 | |||
ad78001241 | |||
5a837a591e | |||
fd79d23910 | |||
1902c0ec93 | |||
85499be855 | |||
e6ddfc7afb | |||
58298ec5ba | |||
0814fc185f | |||
8f8c82d400 | |||
372b7d3d9d | |||
fbffadb2cf | |||
6e52f242b2 | |||
d2a67f362f | |||
66b12da4e7 | |||
42b0d6a83d | |||
94b1c75fd2 | |||
b04b549b34 | |||
09d4b2cd38 | |||
ddfe7d8b91 | |||
4a657ca87f | |||
1e3d478998 | |||
3aebef6d0a | |||
25879466da | |||
27ec1afb7a | |||
06a0d1a872 | |||
04fe7e1a27 | |||
f9cfea244a | |||
5ec062cc71 | |||
91b808381e | |||
8550418875 | |||
00c391320c | |||
9723682d20 | |||
8bf6f6e09f | |||
062c1c13b5 | |||
1b8107094f | |||
8721ac88b1 | |||
6da6f921cd | |||
ef63757b1a | |||
3a169df0a5 | |||
d4f819f1f0 | |||
16fe3c0acc | |||
fd8f4eb3a6 | |||
b261eca865 | |||
a37480eec9 | |||
713aaa3d68 | |||
7d1d0c4e67 | |||
4ad05dbaef | |||
38371aae62 | |||
498a2e4c1e | |||
2078871f36 | |||
140525b7a0 | |||
1a81d46a97 | |||
4c4c4688a9 | |||
b47ac27ac6 | |||
ed18e77655 | |||
fcbec6eb6d | |||
f5c25823bc | |||
f00dfd7bfe | |||
dcca4214f5 | |||
1e9cc285bb | |||
b9c4a0c5f6 | |||
0d339300f9 | |||
63d7d87080 | |||
2ee655f9ba | |||
61a4195ed4 | |||
a6f029ded0 | |||
b54de58e6b | |||
795e37278f | |||
7ce1039d7c | |||
aba42faf69 | |||
815326d42e | |||
7d40a541c9 | |||
2507ee2e56 | |||
a0a451195b | |||
ce247a5637 | |||
59f9c9747f | |||
fec088e3ed | |||
4980ee8fb9 | |||
2ed77d2cc3 | |||
630107ae8a | |||
4eb8074358 | |||
80a02cd90d | |||
7427888e05 | |||
90c1d549a8 | |||
2af003e4e2 | |||
eaf55e174b | |||
0588e578d5 | |||
12f9aac4ea | |||
81bb3fce97 | |||
6011a2f51a | |||
6071bd07ec | |||
1c814d3bb6 | |||
9862048a58 | |||
ebc52a5a65 | |||
eacad922df | |||
d910996613 | |||
2fc220fa33 | |||
8cabda551d | |||
afd033e9c9 | |||
6ec5ba521b | |||
c8e49a7e4e | |||
dee8c8e242 | |||
576543c4b4 | |||
746f2882f7 | |||
c4cbf9d0bb | |||
49bd51b5f9 | |||
e53ae0f9bb | |||
afdd913a2f | |||
3df4efd512 | |||
91dd45c387 | |||
136ee0d576 | |||
1ea8d92cc3 | |||
20fcb99830 | |||
f3265d2111 | |||
d6e7709866 | |||
d11019d9e1 | |||
cfd924622e | |||
27c08b785d | |||
77f38e4449 | |||
16ddfbc4e0 | |||
8dea900869 | |||
f342dee2b4 | |||
1d5721f3bd | |||
3170558d6d | |||
3530aa88d6 | |||
21998890d4 | |||
c9d6bd76c9 | |||
bc2ce178ea | |||
e22e62d184 | |||
4181de119c | |||
56bf24e1ec | |||
e9b4c6289b | |||
7ed92bebd3 | |||
c3f71c1a99 | |||
7050ef675d | |||
070cd5b6c0 | |||
2c2cc33c94 | |||
169c83431c | |||
5f72c68d87 | |||
b184af6d00 | |||
6f55d1e58f | |||
5aea1363cc | |||
0685a36f0e | |||
70739f5cfd | |||
933a66a070 | |||
4167b11434 | |||
2a3b51ac3a | |||
e633292df1 | |||
30b94493bb | |||
c51cc91f92 | |||
8b04046321 | |||
11bb5e26ff | |||
9ac2ac303c | |||
f0784d3b41 | |||
3d8ece8c8b | |||
b0fb71f7d8 | |||
a5cd1b1693 | |||
d8a1eec530 | |||
e20c47c57b | |||
b77b203935 | |||
1ad97ebf85 | |||
ef12c74771 | |||
0bc03e8071 | |||
04286f3228 | |||
1d942cdf41 | |||
aaf0d5c3c5 | |||
04e8acd844 | |||
8ff48dde73 | |||
41b2e629f7 | |||
a60162ba76 | |||
45f4e5ac20 | |||
637f7a5bfa | |||
399ccec645 | |||
2bd280df80 | |||
c832edbda3 | |||
b8d0041851 | |||
0a97d4c825 | |||
5eee947ffe | |||
720e6548c7 | |||
f375459d53 | |||
e842838a23 | |||
00aa038818 | |||
eb78077a0c | |||
d8d939660b | |||
ae089dcff7 | |||
1a4515c0b9 | |||
4eee8e8bdf | |||
9f1421e0a6 | |||
84f199f0dd | |||
8230f8fc9b | |||
02d809f3f4 | |||
b0560cbd99 | |||
d1003ff6c9 | |||
b11ad4077b | |||
5dc7dc1216 | |||
0d4a93018b | |||
3ca40db9f8 | |||
ce607196d1 | |||
0b3af166ae | |||
39e5660c4a | |||
6b985b2d1f | |||
527dc19794 | |||
29e71cbb16 | |||
2d54019f83 | |||
98c8e8e35a | |||
b106b1ed14 | |||
2998a55f0b | |||
e5c4778ff7 | |||
2ec9569b36 | |||
58303d0837 | |||
e3639918eb | |||
6d290bd001 | |||
7683667b3c | |||
9cbc891816 | |||
0454bd1ef6 | |||
f139100b23 | |||
3f666bd5f0 | |||
d53a93e0ae | |||
2059d610a8 | |||
9bbfbd0a6a | |||
6e4f1dc756 | |||
dc13882624 | |||
6bb17d5896 | |||
1a513cbd16 | |||
87fa87d87b | |||
fa1a40ac6e | |||
954428e341 | |||
765752261c | |||
037f90aada | |||
1397bec066 | |||
b105e6f7c4 | |||
4fe2b1100e | |||
c3403ed72d | |||
393f352b70 | |||
e86eb0cfdf | |||
a9a730fd74 | |||
4ff6809bc5 | |||
7b229e4c38 | |||
9ac9b533b6 | |||
f53fc3e06f | |||
0139354780 | |||
011aac43d2 | |||
eb20ae6a3f | |||
7c0af91844 | |||
fc2e3a4ab3 | |||
58cb793c96 | |||
4592f23260 | |||
ccb54136a2 | |||
4c9c047ddf | |||
1feb92679d | |||
a13b9e8bdc | |||
cb723840d9 | |||
923d3e8a84 | |||
0d1623edef | |||
cf149940ed | |||
ef55a6ba7c | |||
e3e4aa89ad | |||
3523296e3d | |||
b2a8085651 | |||
83d73c93f7 | |||
7a2a64803a | |||
baf5adcf33 | |||
689ae5c08d | |||
d9b1e7e810 | |||
b4eece01f8 | |||
cf5396aaed | |||
e390587e91 | |||
bae179ed67 | |||
7e4fcb0868 | |||
fbfdca1de9 | |||
0612eef69b | |||
ae0b7a3ebd | |||
e92612b511 | |||
5c33fd4b94 | |||
c3f51e2980 | |||
de47c0af9e | |||
e53e4e3dd9 | |||
36fe6535c4 | |||
b55e57a7cf | |||
7626db624e | |||
6d8329b255 | |||
461e30148c | |||
57d98e48f7 | |||
cf2babc598 | |||
d10277df31 | |||
d3a1203782 | |||
126f7ab819 | |||
221c2861fc | |||
66667382e1 | |||
a7e928d126 | |||
591fe7e92b | |||
d6e61cbcda | |||
5825366fe4 | |||
6df204cf40 | |||
3f7e1db549 | |||
a6091136b0 | |||
353bbd0e8c | |||
a428e125fa | |||
2e262b2689 | |||
a2d055e408 | |||
57defe00ee | |||
ac5a2676e7 | |||
ed98ea4e43 | |||
729bf0afd2 | |||
2ea7ea153c | |||
2772e66064 | |||
d41f7a8165 | |||
abfd3997eb | |||
788c9be016 | |||
c3d7a79a83 | |||
1782348275 | |||
edfe5c6622 | |||
2b9492317b | |||
5da41edf6a | |||
476e5aaa86 | |||
789fa507b5 | |||
508f936317 | |||
e9d88dda8e | |||
ecceb71a1e | |||
bff77abe6a | |||
98413089f6 | |||
a2446f6c68 | |||
c955049207 | |||
574c00c096 | |||
7415f206ea | |||
f76017a015 | |||
cda05aec04 | |||
639286f8b6 | |||
cc66618e70 | |||
9efc0ec40d | |||
34674fc282 | |||
01c3166043 | |||
bf2e3d5669 | |||
4e9f0b2e2e | |||
223f14710d | |||
f7ae91b85d | |||
445dff499b | |||
9afa05e2f4 | |||
c3e1677b7d | |||
024976cda2 | |||
df541a2a22 | |||
f2ef338cb8 | |||
8c6f64c111 | |||
5a16b2117b | |||
71edcaf20f | |||
ac89d91db5 | |||
e664c1ab05 | |||
adba668109 | |||
ad972725de | |||
185eccf6f5 | |||
c4567bac18 | |||
13409c433a | |||
20431debe0 | |||
797ea356ef | |||
2321473c34 | |||
0d5f65c5f3 | |||
c30241775a | |||
31827d03f9 | |||
7bcdf3e722 | |||
db9a76f7c6 | |||
3fd87e8e82 | |||
22a2786610 | |||
2b5a6df1e1 | |||
5fefeae404 | |||
d4f725d1fa | |||
a096098c1f | |||
cc8c0472ca | |||
fb554071dc | |||
17a17c8957 | |||
2e7d498865 | |||
567157b005 | |||
ec6cbc5135 | |||
8499f0b960 | |||
11432253a1 | |||
f17e1c4a80 | |||
6b2f6a4f87 | |||
671329a3e9 | |||
7e7074502f | |||
aa306d5573 | |||
55669e306e | |||
3f96e070ce | |||
8032a4b564 | |||
b923e8f4df | |||
c5388cf8e7 | |||
cb908a2373 | |||
cecbcd1929 | |||
90e0cc6091 | |||
45bbf6db86 | |||
432476c98a | |||
1f3e227a8b | |||
66c28020c5 | |||
6cfe2a58eb | |||
fc6ad51e68 | |||
d3bc52951a | |||
2f7232859e | |||
4a7232ac99 | |||
72d78432c9 | |||
f6cd42d916 | |||
542dff2a08 | |||
e75e843c88 | |||
146a76247c | |||
f28157cab7 | |||
1ce16ce449 | |||
c310e7e8b7 | |||
aa2ef79e55 | |||
7ad57f1c33 | |||
cbfd331e50 | |||
e6f55b1f6f | |||
bb805e93cb | |||
deb57b960b | |||
8a9b918bf4 | |||
2f6f3d0629 | |||
a60b35f41c | |||
6757f35a3a | |||
ffb9b6d1ba | |||
e401498e4a | |||
d30e940b3b | |||
05ea5e04c8 | |||
a7ef99d0fe | |||
f2a8b52c2c | |||
409ca7ee4e | |||
387b565705 | |||
96f486001d | |||
a498abc14a | |||
c64340a9bb | |||
79d80a5dbf | |||
7ebff5949f | |||
434080572c | |||
c87a0e97ab | |||
2dbd94951c | |||
1e044f50c7 | |||
a7aa98510c | |||
729ab56878 | |||
907b627e16 | |||
10fcca20f8 | |||
59cd1f1433 | |||
4a2c570270 | |||
8c7edbd9c3 | |||
0801e16327 | |||
0df2a365f5 | |||
c7d6d33e6c | |||
c705f3cfeb | |||
7fecb36aee | |||
657a2ea8d9 | |||
dd064f4c96 | |||
3bc05b97ea | |||
bbd515f6f6 | |||
9b3e3a3d9c | |||
a3a2ca4796 | |||
eab13dc565 | |||
bebd1c400c | |||
36d1bb2f52 | |||
ae32695c3e | |||
c5d19a4dbd | |||
78728c6547 | |||
a8032f81d9 | |||
a138791964 | |||
f9f002c8f7 | |||
f192d5c12e | |||
a6724bd03f | |||
c77c3f33ef | |||
623aeee9bf | |||
a241d53d28 | |||
11500d2ff5 | |||
85708bc94f | |||
ba6e8856f2 | |||
c8448b0abf | |||
e35248ffc4 | |||
b47a3b566a | |||
6ab23bd523 | |||
987afff0e9 | |||
564c62f3b3 | |||
8733f95e51 | |||
ce63e9c3c3 | |||
77b7124cf1 | |||
6a608d4b49 | |||
01924618bd | |||
666e2fd0ce | |||
0cfc25d751 | |||
b6d8e6c989 | |||
ab2502f7b8 | |||
c57e6f3bd8 | |||
b54f1ffc1d | |||
bd0ea42277 | |||
7ae43bc4f8 | |||
056682327b | |||
8b66a25f66 | |||
96245dd3b4 | |||
9cc49da68a | |||
224918b463 | |||
cbeefa2503 | |||
6d68806633 | |||
ba3617c22f | |||
b7d9bb2765 | |||
74b42e2251 | |||
c0cf9c3fcc | |||
9f3ce18f06 | |||
b9e3255c9e | |||
e657396f65 | |||
929f608f2f | |||
c6a4bfa886 | |||
d5e25b12b8 | |||
7cf6fe6d62 | |||
155dd653e7 | |||
b5c8cd1766 | |||
4967e389c5 | |||
ffbaebd198 | |||
04b8781c8d | |||
5a4d993f7d | |||
823a172681 | |||
a1943e21ed | |||
01c287bc89 | |||
0cf8249b14 | |||
a8265a799d | |||
18bb653f10 | |||
a003a31952 | |||
0a1c27f873 | |||
75f8e25aed | |||
39c506b419 | |||
ef2641b49b | |||
bce101578d | |||
10e466426a | |||
9b90aeffa5 | |||
601b51890f | |||
2524a00a96 | |||
e31d667bec | |||
c161f698fc | |||
92e687303d | |||
f5b83f9314 | |||
5e7b9ec688 | |||
78ae0b8aee | |||
283dffc035 | |||
0aded2a798 | |||
1b5be892b9 | |||
756c279cdc | |||
08d05df00e | |||
c385862be1 | |||
0eff567910 | |||
94d38c0680 | |||
81285f49fe | |||
877096d49d | |||
bfe60243a4 | |||
ca9d606e72 | |||
24d21467dd | |||
41651136bf | |||
5e5f060fc0 | |||
29ab5fc9c2 | |||
80913b8044 | |||
02960f28e4 | |||
8db338ba14 | |||
dadd8986dc | |||
e2016cf65b | |||
1b214a60fa | |||
8560583ee7 | |||
2932c4ee43 | |||
e8c127a894 | |||
d7ac7ff9a3 | |||
aef7e43c48 | |||
d855b0f98c | |||
c726506b47 | |||
c32e306be9 | |||
13e907c894 | |||
d19a34152f | |||
19cce08b2b | |||
3cd6f66067 | |||
ada588c112 | |||
0d57fe5a7e | |||
5a74beb7e2 | |||
e2d591b9ff | |||
8082185ac4 | |||
85ebc8a1ec | |||
9ca32e664e | |||
566b76121a | |||
562080f22d | |||
bb8bddc758 | |||
9eb8842dda | |||
97558abc29 | |||
160ce092ff | |||
d6974127b4 | |||
092660db52 | |||
348357eb04 | |||
69f6967ad4 | |||
4e3f554b68 | |||
79f6f0dd86 | |||
02f6fab025 | |||
a61fc5b836 | |||
f3a84857d9 | |||
95eb16233c | |||
33654a480b | |||
c296f27640 | |||
4f55f63a77 | |||
a66299a936 | |||
a2cbb68a40 | |||
4163debdd9 | |||
c92ff81ddd | |||
783add8357 | |||
3b77dbbed7 | |||
160ff0961e | |||
06909c451f | |||
b7d8b45e5a | |||
88bfaac7e6 | |||
3c51017e4a | |||
33f6376122 | |||
2beb87136b | |||
f6f8a63b99 | |||
e0ce711eb4 | |||
0911d8d796 | |||
99e5ff78f3 | |||
5236de1433 | |||
0c9451fd5f | |||
dfac1cf71a | |||
1e20e6ef77 | |||
a7b366e74f | |||
3cfd36a5ce | |||
3919f07890 | |||
12e374d0da | |||
36ee4876c6 | |||
05db56760f | |||
e94089ca56 | |||
dc1d0ca698 | |||
627d85ce23 | |||
f6133f2d36 | |||
d8dbfe6e6d | |||
1c450fd3aa | |||
2e47d546b2 | |||
01f13c1b11 | |||
9dc7c2a031 | |||
fe779dace4 | |||
6eef52cc9c | |||
d38131d495 | |||
b4b475d692 | |||
fe17706b6c | |||
d7bad3d70b | |||
5a56ec0636 | |||
35a95f00d9 | |||
93397880ca | |||
8c4c3d8fda | |||
49025d322f | |||
9d2ee6ce63 | |||
70aabca0f7 | |||
dfd59f644b | |||
ee520d1ff5 | |||
ee580f1968 | |||
5179aa0d4f | |||
a7b78fadb0 | |||
d94bcbf249 | |||
086e99efb4 | |||
7b8aba46cc | |||
579c9359df | |||
885e35e892 | |||
e7864c9566 | |||
6e67bc442f | |||
ac9b776aa1 | |||
d8e595907b | |||
1e02fabdec | |||
79bfe731af | |||
a3425a6306 | |||
2e4dd2d591 | |||
f360cc664c | |||
ce6f839153 | |||
01949f7da0 | |||
08de76e2ba | |||
cb97e1fa19 | |||
95e564bfb6 | |||
342b079133 | |||
8138c64116 | |||
64b4e15ce6 | |||
e722fc50b1 | |||
a9f4f611d4 | |||
0fb4fa8f86 | |||
7d73e63c78 | |||
ebb591ef28 | |||
31dea656d5 | |||
768312e870 | |||
5d0e326bfd | |||
8ac4346fd5 | |||
bafec6f1a3 | |||
c6d11294e4 | |||
6ce2497879 | |||
782b178f4e | |||
64529bb1a3 | |||
01dc0d6268 | |||
289b5333d6 | |||
4a17e8c34b | |||
c4cda780d5 | |||
e5669577df | |||
97768ec176 | |||
e25eaed75a | |||
09f6d059a7 | |||
699292b058 | |||
d9cc259df3 | |||
43ad37e7ce | |||
bb816037d6 | |||
04cde11a04 | |||
2f8fde6772 | |||
f224408c07 | |||
21e073a3b4 | |||
f9ea82a2af | |||
1ce6d663af | |||
c1c63067d4 | |||
a8d3e9997e | |||
7cdf7b1769 | |||
429d5011b4 | |||
54f9bd9572 | |||
2a60c96baf | |||
f26f4263ea | |||
507f809da0 | |||
ad83820257 | |||
cd773e3f37 | |||
9da7dce310 | |||
825ab0357e | |||
fead9b50b1 | |||
98463ea168 | |||
74b4544560 | |||
2b5b8fb4c5 | |||
d35b680481 | |||
ca0fbf00f9 | |||
5443e90baf | |||
a5dbb397ca | |||
889f059758 | |||
45a8ed6531 | |||
4c204840e9 | |||
c3001e9ea9 | |||
5cf744dbac | |||
ba2b142c8a | |||
10ab95522d | |||
61218f12fd | |||
852256c1af | |||
8988cb4761 | |||
e0980292ef | |||
cdf3777aa8 | |||
618a54579f | |||
9f69fabe20 | |||
e748ce32bc | |||
fdeedabfd7 | |||
582216e004 | |||
1f6cd8e56e | |||
68fb03577c | |||
bbef8931a6 | |||
8071434515 | |||
7f22a1ab39 | |||
55b0eab3e6 | |||
e85f27c0f3 | |||
e3b4f5038d | |||
b43da1e421 | |||
5c8283b3e4 | |||
3dc533fca0 | |||
d38cbd374a | |||
9175046f35 | |||
888fdc1d54 | |||
d83f1a6319 | |||
ff5f3f3a2c | |||
e4779512e6 | |||
8947a6c9de | |||
fa805b4998 | |||
451c0ee70d | |||
40ac60b941 | |||
7e98d136f4 | |||
c800948342 | |||
7fbc3cb6a6 | |||
d842e246c9 | |||
9946abf731 | |||
1e0464f5b4 | |||
5aefc7d652 | |||
743381de6d | |||
d70ff26164 | |||
316d036785 | |||
c82e6d747b | |||
04330a7a47 | |||
cfbe50057a | |||
9c1b6b80aa | |||
0daf82eee2 | |||
074c39ca5b | |||
1abb8ac6ae | |||
b19a37538c | |||
fc4faacfec | |||
bbc2aa4f2a | |||
1f6bd5c04d | |||
32ffb75394 | |||
7df73824aa | |||
9c32ae2300 | |||
b15dac7edf | |||
2a62132bf0 | |||
a0a82c0f4e | |||
24b46af48a | |||
fed79bfd81 | |||
7dbaac1070 | |||
58d2c4a62f | |||
b847576bb4 | |||
58f155e135 | |||
241ca79114 | |||
3d92531ad3 | |||
c61ee09d26 | |||
c59ddd8a9d | |||
086d07151f | |||
a1cb9c9399 | |||
f265b6ed11 | |||
5db34580f2 | |||
beb49a9446 | |||
ee205971e9 | |||
ded6364e1d | |||
5b6b38564f | |||
31c1a3d804 | |||
81f3460806 | |||
081b345e7c | |||
f468db6757 | |||
c7dcf864cc | |||
6d39bfa703 | |||
4ee1ac015f | |||
b2e2556ef6 | |||
8f74e4e44e | |||
be891daa5a | |||
95a2d6714e | |||
3ce5e53323 | |||
f8c3cdf2ff | |||
88aed98447 | |||
3ae90b66c6 | |||
10c0a8ba70 | |||
d192a14e2e | |||
b49aa22c65 | |||
dae0dc5ebb | |||
35eaa55b3a | |||
bf2d726746 | |||
0dce0022d3 | |||
1bff34a204 | |||
24c60619d5 | |||
b0e12e8852 | |||
f7fa9e9467 | |||
09b6f71853 | |||
e28119f03b | |||
7a40711af3 | |||
b6799dc231 | |||
31c9ea9b28 | |||
6330ab1271 | |||
c35a0fadc3 | |||
bbe034222c | |||
305944e907 | |||
f0754aed53 | |||
99a785179d | |||
21259bc61a | |||
4c67d0579a | |||
cb3c59ec07 | |||
e725b756a6 | |||
dbe6f89ed8 | |||
84e34d2a27 | |||
4d2d535a03 | |||
b0e43f7538 | |||
d66a7adc22 | |||
1a98fd5dfc | |||
57400cee14 | |||
c99bdbf4b9 | |||
a665fa1dec | |||
78048d1d92 | |||
065fe57a7c | |||
f251563af1 | |||
c1ab55f9d9 | |||
27a4d57f7c | |||
22e36bbe9c | |||
d2e1b241be | |||
3d9e40a3a8 | |||
9f85368cce | |||
3243f2dc58 | |||
6b2705769a | |||
ab2587f089 | |||
d3cf568d07 | |||
e417c137fc | |||
d549070fd3 | |||
42ce5ab31f | |||
e190b20ae1 | |||
ce788d96c4 | |||
cc19266470 | |||
18f93b4eb6 | |||
e682ed5a1e | |||
bc44c36385 | |||
bcc8cece24 | |||
a7ff04db0e | |||
a9a51ec1e2 | |||
0495297c6c | |||
75588946c6 | |||
5fa446d3f5 | |||
71fd2de675 | |||
a2fc188526 | |||
166bdd6919 | |||
4d4119e589 | |||
91649df593 | |||
890e811e80 | |||
bb887f94e7 | |||
6e45f7c790 | |||
5580adb4a6 | |||
60a5d72367 | |||
4cfb0ab84d | |||
a1b6c2df75 | |||
feb6060887 | |||
49d2b4b2a2 | |||
286a514fbe | |||
9d3b522e7b | |||
c32642e130 | |||
7a3fa35bd8 | |||
0154fc15cb | |||
24d173c3b9 | |||
d4c1b6f2c2 | |||
58c051f564 | |||
763aa7fe37 | |||
cd88fb0882 | |||
ec843659d8 | |||
2997a405a0 | |||
57f28c2017 | |||
b3b70b78cf | |||
48018bd6e6 | |||
61952a9bcd | |||
602cc104f9 | |||
d71a39211d | |||
f77a8b02e3 | |||
aa2cd0db00 | |||
f127ef6019 | |||
3ae7327687 | |||
23e61cc0f7 | |||
b5002265cf | |||
e48ea94789 | |||
6539c6982c | |||
d877d77b63 | |||
1df6cde026 | |||
fafae8181b | |||
151fc52c1c | |||
ea79340dc7 | |||
9e88514700 | |||
752378a8cb | |||
8465cc0c83 | |||
2ddf8f1619 | |||
f7aa0f89e3 | |||
3d322fdb28 | |||
981adf1989 | |||
dbc3bee3a0 | |||
3f2b7b706a | |||
c243417585 | |||
514a6c0879 | |||
76f9ecce75 | |||
410ca55e88 | |||
66c05041e8 | |||
aafabd8e8d | |||
eb1a774778 | |||
75c89e7b35 | |||
e31a2136fc | |||
380722402f | |||
030c8542e7 | |||
1f25d4434e | |||
f29904e217 | |||
7246db7691 | |||
4bdbc6c1fc | |||
8e6fdb20eb | |||
016d0d699e | |||
6771603a05 | |||
d067cf0e84 | |||
13593d73a3 | |||
bc86ae800a | |||
df52dceaa1 |
12
.clang-format
Normal file
12
.clang-format
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
|
||||||
|
|
||||||
|
BasedOnStyle: Google
|
||||||
|
Standard: c++11
|
||||||
|
AllowShortFunctionsOnASingleLine: Empty
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
|
||||||
|
# Always break after if to get accurate coverage
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
18
.devcontainer/clang10/devcontainer.json
Normal file
18
.devcontainer/clang10/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/clang11/devcontainer.json
Normal file
18
.devcontainer/clang11/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
.devcontainer/clang13/Dockerfile
Normal file
5
.devcontainer/clang13/Dockerfile
Normal 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
|
20
.devcontainer/clang13/devcontainer.json
Normal file
20
.devcontainer/clang13/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
.devcontainer/clang14/Dockerfile
Normal file
5
.devcontainer/clang14/Dockerfile
Normal 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
|
20
.devcontainer/clang14/devcontainer.json
Normal file
20
.devcontainer/clang14/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
.devcontainer/clang15/Dockerfile
Normal file
5
.devcontainer/clang15/Dockerfile
Normal 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
|
20
.devcontainer/clang15/devcontainer.json
Normal file
20
.devcontainer/clang15/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
.devcontainer/clang16/Dockerfile
Normal file
5
.devcontainer/clang16/Dockerfile
Normal 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
|
20
.devcontainer/clang16/devcontainer.json
Normal file
20
.devcontainer/clang16/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
.devcontainer/clang17/Dockerfile
Normal file
5
.devcontainer/clang17/Dockerfile
Normal 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
|
20
.devcontainer/clang17/devcontainer.json
Normal file
20
.devcontainer/clang17/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/clang5/devcontainer.json
Normal file
18
.devcontainer/clang5/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/clang6/devcontainer.json
Normal file
18
.devcontainer/clang6/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/clang7/devcontainer.json
Normal file
18
.devcontainer/clang7/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/clang8/devcontainer.json
Normal file
18
.devcontainer/clang8/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/clang9/devcontainer.json
Normal file
18
.devcontainer/clang9/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc10/devcontainer.json
Normal file
18
.devcontainer/gcc10/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc11/devcontainer.json
Normal file
18
.devcontainer/gcc11/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
.devcontainer/gcc12/Dockerfile
Normal file
4
.devcontainer/gcc12/Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y cmake git g++-12
|
20
.devcontainer/gcc12/devcontainer.json
Normal file
20
.devcontainer/gcc12/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
.devcontainer/gcc48/devcontainer.json
Normal file
20
.devcontainer/gcc48/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc5/devcontainer.json
Normal file
18
.devcontainer/gcc5/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc6/devcontainer.json
Normal file
18
.devcontainer/gcc6/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc7/devcontainer.json
Normal file
18
.devcontainer/gcc7/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc8/devcontainer.json
Normal file
18
.devcontainer/gcc8/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
.devcontainer/gcc9/devcontainer.json
Normal file
18
.devcontainer/gcc9/devcontainer.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
* text=auto
|
||||||
|
*.sh text eol=lf
|
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
github: bblanchon
|
||||||
|
custom:
|
||||||
|
- https://arduinojson.org/book/
|
||||||
|
- https://donate.benoitblanchon.fr/
|
54
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
54
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal 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
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal 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.
|
19
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
19
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal 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
51
.github/ISSUE_TEMPLATE/help.md
vendored
Normal 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]
|
||||||
|
```
|
601
.github/workflows/ci.yml
vendored
Normal file
601
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,601 @@
|
|||||||
|
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: "7"
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
archive: focal
|
||||||
|
- clang: "8"
|
||||||
|
cxxflags: -fsanitize=leak -fno-sanitize-recover=all
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
archive: focal
|
||||||
|
- clang: "9"
|
||||||
|
cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
archive: focal
|
||||||
|
- clang: "10"
|
||||||
|
cxxflags: -fsanitize=address -fno-sanitize-recover=all
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
archive: focal
|
||||||
|
- clang: "11"
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
- clang: "12"
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
- clang: "13"
|
||||||
|
runner: ubuntu-22.04
|
||||||
|
- clang: 14
|
||||||
|
- clang: 15
|
||||||
|
- clang: 16
|
||||||
|
- clang: 17
|
||||||
|
- clang: 18
|
||||||
|
- clang: 19
|
||||||
|
runs-on: ${{ matrix.runner || 'ubuntu-latest' }}
|
||||||
|
steps:
|
||||||
|
- name: Add archive repositories
|
||||||
|
if: matrix.archive
|
||||||
|
run: |
|
||||||
|
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
|
||||||
|
sudo gpg --export 3B4FE6ACC0B21F32 | sudo tee /etc/apt/trusted.gpg.d/ubuntu-keyring.gpg > /dev/null
|
||||||
|
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 }}
|
||||||
|
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-22.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-22.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-22.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-22.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-22.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-latest
|
||||||
|
steps:
|
||||||
|
- name: Install
|
||||||
|
run: sudo apt-get install -y clang-tidy libc++-dev libc++abi-dev
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Configure
|
||||||
|
run: cmake -G Ninja -DCMAKE_CXX_CLANG_TIDY="clang-tidy;--warnings-as-errors=*" -DCMAKE_BUILD_TYPE=Debug .
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CXX: clang++
|
||||||
|
- name: Check
|
||||||
|
run: cmake --build . -- -k 0
|
||||||
|
|
||||||
|
amalgamate:
|
||||||
|
needs: gcc
|
||||||
|
name: Amalgamate ArduinoJson.h
|
||||||
|
runs-on: ubuntu-22.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-22.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
14
.github/workflows/lock.yml
vendored
Normal 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
93
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v*.*.*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Create release
|
||||||
|
runs-on: ubuntu-22.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 }}
|
26
.gitignore
vendored
26
.gitignore
vendored
@ -1,6 +1,20 @@
|
|||||||
*.sdf
|
.DS_Store
|
||||||
*.user
|
/.idea
|
||||||
*.suo
|
/build
|
||||||
Debug
|
/bin
|
||||||
ipch
|
/lib
|
||||||
*.opensdf
|
/sftp-config.json
|
||||||
|
.tags
|
||||||
|
.tags_sorted_by_file
|
||||||
|
/extras/fuzzing/*_fuzzer
|
||||||
|
/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/
|
||||||
|
4
.mbedignore
Normal file
4
.mbedignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.devcontainer/
|
||||||
|
.github/
|
||||||
|
examples/
|
||||||
|
extras/
|
1
.prettierignore
Normal file
1
.prettierignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.md
|
17
.vscode/settings.json
vendored
Normal file
17
.vscode/settings.json
vendored
Normal 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,
|
||||||
|
}
|
||||||
|
}
|
5
ArduinoJson.h
Normal file
5
ArduinoJson.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2025, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include "src/ArduinoJson.h"
|
@ -1,40 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio 2013
|
|
||||||
VisualStudioVersion = 12.0.21005.1
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JsonGeneratorTests", "JsonGeneratorTests\JsonGeneratorTests.vcxproj", "{B9545D97-E084-4A19-8E48-929157064360}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JsonParserTests", "JsonParserTests\JsonParserTests.vcxproj", "{4DD596EF-0185-4AB4-A3C2-F20C496F7806}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JsonParser", "JsonParser\JsonParser.vcxproj", "{C15274DE-2695-4DFE-8520-4424223FE6DA}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JsonGenerator", "JsonGenerator\JsonGenerator.vcxproj", "{C6536D27-738D-4CEB-A2BC-E13C8897D894}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{B9545D97-E084-4A19-8E48-929157064360}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B9545D97-E084-4A19-8E48-929157064360}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{B9545D97-E084-4A19-8E48-929157064360}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B9545D97-E084-4A19-8E48-929157064360}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{4DD596EF-0185-4AB4-A3C2-F20C496F7806}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{4DD596EF-0185-4AB4-A3C2-F20C496F7806}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{4DD596EF-0185-4AB4-A3C2-F20C496F7806}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{4DD596EF-0185-4AB4-A3C2-F20C496F7806}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{C15274DE-2695-4DFE-8520-4424223FE6DA}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{C15274DE-2695-4DFE-8520-4424223FE6DA}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{C15274DE-2695-4DFE-8520-4424223FE6DA}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{C15274DE-2695-4DFE-8520-4424223FE6DA}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{C6536D27-738D-4CEB-A2BC-E13C8897D894}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{C6536D27-738D-4CEB-A2BC-E13C8897D894}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{C6536D27-738D-4CEB-A2BC-E13C8897D894}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{C6536D27-738D-4CEB-A2BC-E13C8897D894}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
313
CHANGELOG.md
313
CHANGELOG.md
@ -1,80 +1,287 @@
|
|||||||
Arduino JSON: change log
|
ArduinoJson: change log
|
||||||
========================
|
=======================
|
||||||
|
|
||||||
v3.1
|
HEAD
|
||||||
----
|
----
|
||||||
|
|
||||||
* Calling `Generator::JsonObject::add()` twice with the same `key` now replaces the `value`
|
* Optimize storage of static strings
|
||||||
* Added `Generator::JsonObject::operator[]`, see bellow the new API
|
|
||||||
* Added `Generator::JsonObject::remove()`
|
|
||||||
|
|
||||||
Old generator API:
|
> ### BREAKING CHANGES
|
||||||
|
>
|
||||||
|
> Static string cannot contain NUL characters anymore (they could since 7.3.0).
|
||||||
|
> This is an extremely rare case, so you probably won't be affected.
|
||||||
|
>
|
||||||
|
> For example, the following code produces different output in 7.3 and 7.4:
|
||||||
|
>
|
||||||
|
> ```cpp
|
||||||
|
> JsonDocument doc;
|
||||||
|
> doc["a\0b"] = "c\0d";
|
||||||
|
> serializeJson(doc, Serial);
|
||||||
|
> // With Arduino 7.3 -> {"a\u0000b":"c\u0000d"}
|
||||||
|
> // With Arduino 7.4 -> {"a":"c"}
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> `JsonString` contructor now only accepts two arguments, not three.
|
||||||
|
> If your code uses `JsonString` to store a string as a pointer, you must remove the size argument.
|
||||||
|
>
|
||||||
|
> For example, if you have something like this:
|
||||||
|
>
|
||||||
|
> ```cpp
|
||||||
|
> doc["key"] = JsonString(str.c_str(), str.size(), true);
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> You must replace with either:
|
||||||
|
>
|
||||||
|
> ```cpp
|
||||||
|
> doc["key"] = JsonString(str.c_str(), true); // store as pointer, cannot contain NUL characters
|
||||||
|
> doc["key"] = JsonString(str.c_str(), str.size()); // store by copy, NUL characters allowed
|
||||||
|
> doc["key"] = str; // same as previous line for supported string classes (`String`, `std::string`, etc.)
|
||||||
|
> ```
|
||||||
|
|
||||||
JsonObject<3> root;
|
v7.4.1 (2025-04-11)
|
||||||
root.add("sensor", "gps");
|
------
|
||||||
root.add("time", 1351824120);
|
|
||||||
root.add("data", array);
|
|
||||||
|
|
||||||
New generator API:
|
* Fix crash with tiny Flash strings (issue #2170)
|
||||||
|
|
||||||
JsonObject<3> root;
|
v7.4.0 (2025-04-09)
|
||||||
root["sensor"] = "gps";
|
------
|
||||||
root["time"] = 1351824120;
|
|
||||||
root["data"] = array;
|
|
||||||
|
|
||||||
v3.0
|
* Optimize storage of tiny strings (up to 3 characters)
|
||||||
----
|
* Fix support for `const char[]` (issue #2166)
|
||||||
|
|
||||||
* New parser API, see bellow
|
v7.3.1 (2025-02-27)
|
||||||
* Renamed `JsonHashTable` into `JsonObject`
|
------
|
||||||
* Added iterators for `JsonArray` and `JsonObject`
|
|
||||||
|
|
||||||
Old parser API:
|
* Fix conversion from static string to number
|
||||||
|
* Slightly reduce code size
|
||||||
|
|
||||||
JsonHashTable root = parser.parseHashTable(json);
|
v7.3.0 (2024-12-29)
|
||||||
|
------
|
||||||
|
|
||||||
char* sensor = root.getString("sensor");
|
* Fix support for NUL characters in `deserializeJson()`
|
||||||
long time = root.getLong("time");
|
* Make `ElementProxy` and `MemberProxy` non-copyable
|
||||||
double latitude = root.getArray("data").getDouble(0);
|
* Change string copy policy: only string literal are stored by pointer
|
||||||
double longitude = root.getArray("data").getDouble(1);
|
* `JsonString` is now stored by copy, unless specified otherwise
|
||||||
|
* Replace undocumented `JsonString::Ownership` with `bool`
|
||||||
|
* Rename undocumented `JsonString::isLinked()` to `isStatic()`
|
||||||
|
* Move public facing SFINAEs to template declarations
|
||||||
|
|
||||||
New parser API:
|
> ### BREAKING CHANGES
|
||||||
|
>
|
||||||
|
> In previous versions, `MemberProxy` (the class returned by `operator[]`) could lead to dangling pointers when used with a temporary string.
|
||||||
|
> To prevent this issue, `MemberProxy` and `ElementProxy` are now non-copyable.
|
||||||
|
>
|
||||||
|
> Your code is likely to be affected if you use `auto` to store the result of `operator[]`. For example, the following line won't compile anymore:
|
||||||
|
>
|
||||||
|
> ```cpp
|
||||||
|
> auto value = doc["key"];
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> To fix the issue, you must append either `.as<T>()` or `.to<T>()`, depending on the situation.
|
||||||
|
>
|
||||||
|
> For example, if you are extracting values from a JSON document, you should update like this:
|
||||||
|
>
|
||||||
|
> ```diff
|
||||||
|
> - auto config = doc["config"];
|
||||||
|
> + auto config = doc["config"].as<JsonObject>();
|
||||||
|
> const char* name = config["name"];
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> However, if you are building a JSON document, you should update like this:
|
||||||
|
>
|
||||||
|
> ```diff
|
||||||
|
> - auto config = doc["config"];
|
||||||
|
> + auto config = doc["config"].to<JsonObject>();
|
||||||
|
> config["name"] = "ArduinoJson";
|
||||||
|
> ```
|
||||||
|
|
||||||
JsonObject root = parser.parse(json);
|
v7.2.1 (2024-11-15)
|
||||||
|
------
|
||||||
|
|
||||||
char* sensor = root["sensor"];
|
* Forbid `deserializeJson(JsonArray|JsonObject, ...)` (issue #2135)
|
||||||
long time = root["time"];
|
* Fix VLA support in `JsonDocument::set()`
|
||||||
double latitude = root["data"][0];
|
* Fix `operator[](variant)` ignoring NUL characters
|
||||||
double longitude = root["data"][1];
|
|
||||||
|
|
||||||
v2.1
|
v7.2.0 (2024-09-18)
|
||||||
----
|
------
|
||||||
|
|
||||||
* Fixed case `#include "jsmn.cpp"` which caused an error in Linux (issue #6)
|
* Store object members with two slots: one for the key and one for the value
|
||||||
* Fixed a buffer overrun in JSON Parser (issue #5)
|
* Store 64-bit numbers (`double` and `long long`) in an additional slot
|
||||||
|
* Reduce the slot size (see table below)
|
||||||
|
* Improve message when user forgets third arg of `serializeJson()` et al.
|
||||||
|
* Set `ARDUINOJSON_USE_DOUBLE` to `0` by default on 8-bit architectures
|
||||||
|
* Deprecate `containsKey()` in favor of `doc["key"].is<T>()`
|
||||||
|
* Add support for escape sequence `\'` (issue #2124)
|
||||||
|
|
||||||
v2.0
|
| Architecture | before | after |
|
||||||
----
|
|--------------|----------|----------|
|
||||||
|
| 8-bit | 8 bytes | 6 bytes |
|
||||||
|
| 32-bit | 16 bytes | 8 bytes |
|
||||||
|
| 64-bit | 24 bytes | 16 bytes |
|
||||||
|
|
||||||
* Added JSON encoding (issue #2)
|
> ### BREAKING CHANGES
|
||||||
* Renamed the library `ArduinoJsonParser` becomes `ArduinoJson`
|
>
|
||||||
|
> After being on the death row for years, the `containsKey()` method has finally been deprecated.
|
||||||
|
> You should replace `doc.containsKey("key")` with `doc["key"].is<T>()`, which not only checks that the key exists but also that the value is of the expected type.
|
||||||
|
>
|
||||||
|
> ```cpp
|
||||||
|
> // Before
|
||||||
|
> if (doc.containsKey("value")) {
|
||||||
|
> int value = doc["value"];
|
||||||
|
> // ...
|
||||||
|
> }
|
||||||
|
>
|
||||||
|
> // After
|
||||||
|
> if (doc["value"].is<int>()) {
|
||||||
|
> int value = doc["value"];
|
||||||
|
> // ...
|
||||||
|
> }
|
||||||
|
> ```
|
||||||
|
|
||||||
**Breaking change**: you need to add the following line at the top of your program.
|
v7.1.0 (2024-06-27)
|
||||||
|
------
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
* Add `ARDUINOJSON_STRING_LENGTH_SIZE` to the namespace name
|
||||||
|
* Add support for MsgPack binary (PR #2078 by @Sanae6)
|
||||||
|
* Add support for MsgPack extension
|
||||||
|
* Make string support even more generic (PR #2084 by @d-a-v)
|
||||||
|
* Optimize `deserializeMsgPack()`
|
||||||
|
* Allow using a `JsonVariant` as a key or index (issue #2080)
|
||||||
|
Note: works only for reading, not for writing
|
||||||
|
* Support `ElementProxy` and `MemberProxy` in `JsonDocument`'s constructor
|
||||||
|
* Don't add partial objects when allocation fails (issue #2081)
|
||||||
|
* Read MsgPack's 64-bit integers even if `ARDUINOJSON_USE_LONG_LONG` is `0`
|
||||||
|
(they are set to `null` if they don't fit in a `long`)
|
||||||
|
|
||||||
v1.2
|
v7.0.4 (2024-03-12)
|
||||||
----
|
------
|
||||||
|
|
||||||
* Fixed error in JSON parser example (issue #1)
|
* Make `JSON_STRING_SIZE(N)` return `N+1` to fix third-party code (issue #2054)
|
||||||
|
|
||||||
v1.1
|
v7.0.3 (2024-02-05)
|
||||||
----
|
------
|
||||||
|
|
||||||
* Example: changed `char* json` into `char[] json` so that the bytes are not write protected
|
* Improve error messages when using `char` or `char*` (issue #2043)
|
||||||
* Fixed parsing bug when the JSON contains multi-dimensional arrays
|
* Reduce stack consumption (issue #2046)
|
||||||
|
* Fix compatibility with GCC 4.8 (issue #2045)
|
||||||
|
|
||||||
v1.0
|
v7.0.2 (2024-01-19)
|
||||||
----
|
------
|
||||||
|
|
||||||
Initial release
|
* Fix assertion `poolIndex < count_` after `JsonDocument::clear()` (issue #2034)
|
||||||
|
|
||||||
|
v7.0.1 (2024-01-10)
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix "no matching function" with `JsonObjectConst::operator[]` (issue #2019)
|
||||||
|
* Remove unused files in the PlatformIO package
|
||||||
|
* Fix `volatile bool` serialized as `1` or `0` instead of `true` or `false` (issue #2029)
|
||||||
|
|
||||||
|
v7.0.0 (2024-01-03)
|
||||||
|
------
|
||||||
|
|
||||||
|
* Remove `BasicJsonDocument`
|
||||||
|
* Remove `StaticJsonDocument`
|
||||||
|
* Add abstract `Allocator` class
|
||||||
|
* Merge `DynamicJsonDocument` with `JsonDocument`
|
||||||
|
* Remove `JSON_ARRAY_SIZE()`, `JSON_OBJECT_SIZE()`, and `JSON_STRING_SIZE()`
|
||||||
|
* Remove `ARDUINOJSON_ENABLE_STRING_DEDUPLICATION` (string deduplication cannot be disabled anymore)
|
||||||
|
* Remove `JsonDocument::capacity()`
|
||||||
|
* Store the strings in the heap
|
||||||
|
* Reference-count shared strings
|
||||||
|
* Always store `serialized("string")` by copy (#1915)
|
||||||
|
* Remove the zero-copy mode of `deserializeJson()` and `deserializeMsgPack()`
|
||||||
|
* Fix double lookup in `to<JsonVariant>()`
|
||||||
|
* Fix double call to `size()` in `serializeMsgPack()`
|
||||||
|
* Include `ARDUINOJSON_SLOT_OFFSET_SIZE` in the namespace name
|
||||||
|
* Remove `JsonVariant::shallowCopy()`
|
||||||
|
* `JsonDocument`'s capacity grows as needed, no need to pass it to the constructor anymore
|
||||||
|
* `JsonDocument`'s allocator is not monotonic anymore, removed values get recycled
|
||||||
|
* Show a link to the documentation when user passes an unsupported input type
|
||||||
|
* Remove `JsonDocument::memoryUsage()`
|
||||||
|
* Remove `JsonDocument::garbageCollect()`
|
||||||
|
* Add `deserializeJson(JsonVariant, ...)` and `deserializeMsgPack(JsonVariant, ...)` (#1226)
|
||||||
|
* Call `shrinkToFit()` in `deserializeJson()` and `deserializeMsgPack()`
|
||||||
|
* `serializeJson()` and `serializeMsgPack()` replace the content of `std::string` and `String` instead of appending to it
|
||||||
|
* Replace `add()` with `add<T>()` (`add(T)` is still supported)
|
||||||
|
* Remove `createNestedArray()` and `createNestedObject()` (use `to<JsonArray>()` and `to<JsonObject>()` instead)
|
||||||
|
|
||||||
|
> ### BREAKING CHANGES
|
||||||
|
>
|
||||||
|
> As every major release, ArduinoJson 7 introduces several breaking changes.
|
||||||
|
> I added some stubs so that most existing programs should compile, but I highty recommend you upgrade your code.
|
||||||
|
>
|
||||||
|
> #### `JsonDocument`
|
||||||
|
>
|
||||||
|
> In ArduinoJson 6, you could allocate the memory pool on the stack (with `StaticJsonDocument`) or in the heap (with `DynamicJsonDocument`).
|
||||||
|
> In ArduinoJson 7, the memory pool is always allocated in the heap, so `StaticJsonDocument` and `DynamicJsonDocument` have been merged into `JsonDocument`.
|
||||||
|
>
|
||||||
|
> In ArduinoJson 6, `JsonDocument` had a fixed capacity; in ArduinoJson 7, it has an elastic capacity that grows as needed.
|
||||||
|
> Therefore, you don't need to specify the capacity anymore, so the macros `JSON_ARRAY_SIZE()`, `JSON_OBJECT_SIZE()`, and `JSON_STRING_SIZE()` have been removed.
|
||||||
|
>
|
||||||
|
> ```c++
|
||||||
|
> // ArduinoJson 6
|
||||||
|
> StaticJsonDocument<256> doc;
|
||||||
|
> // or
|
||||||
|
> DynamicJsonDocument doc(256);
|
||||||
|
>
|
||||||
|
> // ArduinoJson 7
|
||||||
|
> JsonDocument doc;
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> In ArduinoJson 7, `JsonDocument` reuses released memory, so `garbageCollect()` has been removed.
|
||||||
|
> `shrinkToFit()` is still available and releases the over-allocated memory.
|
||||||
|
>
|
||||||
|
> Due to a change in the implementation, it's not possible to store a pointer to a variant from another `JsonDocument`, so `shallowCopy()` has been removed.
|
||||||
|
>
|
||||||
|
> In ArduinoJson 6, the meaning of `memoryUsage()` was clear: it returned the number of bytes used in the memory pool.
|
||||||
|
> In ArduinoJson 7, the meaning of `memoryUsage()` would be ambiguous, so it has been removed.
|
||||||
|
>
|
||||||
|
> #### Custom allocators
|
||||||
|
>
|
||||||
|
> In ArduinoJson 6, you could specify a custom allocator class as a template parameter of `BasicJsonDocument`.
|
||||||
|
> In ArduinoJson 7, you must inherit from `ArduinoJson::Allocator` and pass a pointer to an instance of your class to the constructor of `JsonDocument`.
|
||||||
|
>
|
||||||
|
> ```c++
|
||||||
|
> // ArduinoJson 6
|
||||||
|
> class MyAllocator {
|
||||||
|
> // ...
|
||||||
|
> };
|
||||||
|
> BasicJsonDocument<MyAllocator> doc(256);
|
||||||
|
>
|
||||||
|
> // ArduinoJson 7
|
||||||
|
> class MyAllocator : public ArduinoJson::Allocator {
|
||||||
|
> // ...
|
||||||
|
> };
|
||||||
|
> MyAllocator myAllocator;
|
||||||
|
> JsonDocument doc(&myAllocator);
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> #### `createNestedArray()` and `createNestedObject()`
|
||||||
|
>
|
||||||
|
> In ArduinoJson 6, you could create a nested array or object with `createNestedArray()` and `createNestedObject()`.
|
||||||
|
> In ArduinoJson 7, you must use `add<T>()` or `to<T>()` instead.
|
||||||
|
>
|
||||||
|
> For example, to create `[[],{}]`, you would write:
|
||||||
|
>
|
||||||
|
> ```c++
|
||||||
|
> // ArduinoJson 6
|
||||||
|
> arr.createNestedArray();
|
||||||
|
> arr.createNestedObject();
|
||||||
|
>
|
||||||
|
> // ArduinoJson 7
|
||||||
|
> arr.add<JsonArray>();
|
||||||
|
> arr.add<JsonObject>();
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> And to create `{"array":[],"object":{}}`, you would write:
|
||||||
|
>
|
||||||
|
> ```c++
|
||||||
|
> // ArduinoJson 6
|
||||||
|
> obj.createNestedArray("array");
|
||||||
|
> obj.createNestedObject("object");
|
||||||
|
>
|
||||||
|
> // ArduinoJson 7
|
||||||
|
> obj["array"].to<JsonArray>();
|
||||||
|
> obj["object"].to<JsonObject>();
|
||||||
|
> ```
|
||||||
|
25
CMakeLists.txt
Normal file
25
CMakeLists.txt
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# ArduinoJson - https://arduinojson.org
|
||||||
|
# Copyright © 2014-2025, Benoit BLANCHON
|
||||||
|
# MIT License
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.15)
|
||||||
|
|
||||||
|
if(ESP_PLATFORM)
|
||||||
|
# Build ArduinoJson as an ESP-IDF component
|
||||||
|
idf_component_register(INCLUDE_DIRS src)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
project(ArduinoJson VERSION 7.4.1)
|
||||||
|
|
||||||
|
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
||||||
|
include(CTest)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
|
||||||
|
include(extras/CompileOptions.cmake)
|
||||||
|
add_subdirectory(extras/tests)
|
||||||
|
add_subdirectory(extras/fuzzing)
|
||||||
|
endif()
|
10
CONTRIBUTING.md
Normal file
10
CONTRIBUTING.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Contribution to ArduinoJson
|
||||||
|
|
||||||
|
First, thank you for taking the time to contribute to this project.
|
||||||
|
|
||||||
|
You can submit changes via GitHub Pull Requests.
|
||||||
|
|
||||||
|
Please:
|
||||||
|
|
||||||
|
1. Update the test suite for any change of behavior
|
||||||
|
2. Use clang-format in "file" mode to format the code
|
@ -1,12 +0,0 @@
|
|||||||
/*
|
|
||||||
* malloc-free JSON parser for Arduino
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This file is here to help the Arduino IDE find the .cpp files
|
|
||||||
|
|
||||||
#include "JsonGenerator/EscapedString.cpp"
|
|
||||||
#include "JsonGenerator/JsonArrayBase.cpp"
|
|
||||||
#include "JsonGenerator/JsonObjectBase.cpp"
|
|
||||||
#include "JsonGenerator/JsonValue.cpp"
|
|
||||||
#include "JsonGenerator/StringBuilder.cpp"
|
|
@ -1,7 +0,0 @@
|
|||||||
/*
|
|
||||||
* malloc-free JSON parser for Arduino
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonGenerator/JsonArray.h"
|
|
||||||
#include "JsonGenerator/JsonObject.h"
|
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "EscapedString.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
static inline char getSpecialChar(char c)
|
|
||||||
{
|
|
||||||
// Optimized for code size on a 8-bit AVR
|
|
||||||
|
|
||||||
const char* p = "\"\"\\\\\bb\ff\nn\rr\tt\0";
|
|
||||||
|
|
||||||
while (p[0] && p[0] != c)
|
|
||||||
{
|
|
||||||
p += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return p[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t printCharTo(char c, Print& p)
|
|
||||||
{
|
|
||||||
char specialChar = getSpecialChar(c);
|
|
||||||
|
|
||||||
return specialChar != 0
|
|
||||||
? p.write('\\') + p.write(specialChar)
|
|
||||||
: p.write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t EscapedString::printTo(const char* s, Print& p)
|
|
||||||
{
|
|
||||||
if (!s) return p.print("null");
|
|
||||||
|
|
||||||
size_t n = p.write('\"');
|
|
||||||
|
|
||||||
while (*s)
|
|
||||||
{
|
|
||||||
n += printCharTo(*s++, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return n + p.write('\"');
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Internals
|
|
||||||
{
|
|
||||||
class EscapedString
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static size_t printTo(const char*, Print&);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonArrayBase.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
template<int N>
|
|
||||||
class JsonArray : public JsonArrayBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonArray()
|
|
||||||
: JsonArrayBase(items, N)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
JsonValue items[N];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonArrayBase.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t JsonArrayBase::printTo(Print& p) const
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
n += p.write('[');
|
|
||||||
|
|
||||||
// NB: the code has been optimized for a small size on a 8-bit AVR
|
|
||||||
|
|
||||||
const JsonValue* current = items;
|
|
||||||
for (int i = count; i > 0; i--)
|
|
||||||
{
|
|
||||||
n += current->printTo(p);
|
|
||||||
current++;
|
|
||||||
|
|
||||||
if (i > 1)
|
|
||||||
{
|
|
||||||
n += p.write(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
n += p.write(']');
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonPrintable.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
class JsonArrayBase : public JsonPrintable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonArrayBase(JsonValue* items, int capacity)
|
|
||||||
: items(items), capacity(capacity), count(0)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void add(T value)
|
|
||||||
{
|
|
||||||
if (count >= capacity) return;
|
|
||||||
|
|
||||||
items[count++] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void add(double value)
|
|
||||||
{
|
|
||||||
if (count >= capacity) return;
|
|
||||||
|
|
||||||
JsonValue& v = items[count++];
|
|
||||||
v.set<DIGITS>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const;
|
|
||||||
|
|
||||||
using JsonPrintable::printTo;
|
|
||||||
|
|
||||||
private:
|
|
||||||
JsonValue* items;
|
|
||||||
int capacity, count;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,96 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="EscapedString.h" />
|
|
||||||
<ClInclude Include="JsonArray.h" />
|
|
||||||
<ClInclude Include="JsonArrayBase.h" />
|
|
||||||
<ClInclude Include="JsonObject.h" />
|
|
||||||
<ClInclude Include="JsonObjectBase.h" />
|
|
||||||
<ClInclude Include="JsonPrintable.h" />
|
|
||||||
<ClInclude Include="JsonValue.h" />
|
|
||||||
<ClInclude Include="Print.h" />
|
|
||||||
<ClInclude Include="Printable.h" />
|
|
||||||
<ClInclude Include="StringBuilder.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="EscapedString.cpp" />
|
|
||||||
<ClCompile Include="JsonArrayBase.cpp" />
|
|
||||||
<ClCompile Include="JsonObjectBase.cpp" />
|
|
||||||
<ClCompile Include="JsonValue.cpp" />
|
|
||||||
<ClCompile Include="Print.cpp" />
|
|
||||||
<ClCompile Include="StringBuilder.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{C6536D27-738D-4CEB-A2BC-E13C8897D894}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>JsonGenerator</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup />
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="EscapedString.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonArray.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonArrayBase.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonPrintable.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonValue.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Print.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Printable.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="StringBuilder.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonObjectBase.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonObject.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="EscapedString.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonArrayBase.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="StringBuilder.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Print.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObjectBase.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonObjectBase.h"
|
|
||||||
|
|
||||||
#ifndef ARDUINO_JSON_NO_DEPRECATION_WARNING
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define DEPRECATED __attribute__((deprecated))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define DEPRECATED __declspec(deprecated)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define DEPRECATED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
template <int N>
|
|
||||||
class JsonObject : public JsonObjectBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonObject()
|
|
||||||
: JsonObjectBase(items, N)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
KeyValuePair items[N];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Obsolete: use JsonObject instead
|
|
||||||
template <int N>
|
|
||||||
class DEPRECATED JsonHashTable : public JsonObject<N>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonObjectBase.h"
|
|
||||||
#include <string.h> // for strcmp
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
JsonValue JsonObjectBase::nullValue;
|
|
||||||
|
|
||||||
size_t JsonObjectBase::printTo(Print& p) const
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
n += p.write('{');
|
|
||||||
|
|
||||||
// NB: the code has been optimized for a small size on a 8-bit AVR
|
|
||||||
|
|
||||||
const KeyValuePair* current = items;
|
|
||||||
for (int i = count; i > 0; i--)
|
|
||||||
{
|
|
||||||
n += EscapedString::printTo(current->key, p);
|
|
||||||
n += p.write(':');
|
|
||||||
n += current->value.printTo(p);
|
|
||||||
|
|
||||||
current++;
|
|
||||||
|
|
||||||
if (i > 1)
|
|
||||||
{
|
|
||||||
n += p.write(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
n += p.write('}');
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonObjectBase::KeyValuePair* JsonObjectBase::getMatchingPair(JsonKey key) const
|
|
||||||
{
|
|
||||||
KeyValuePair* p = items;
|
|
||||||
|
|
||||||
for (int i = count; i > 0; --i)
|
|
||||||
{
|
|
||||||
if (!strcmp(p->key, key))
|
|
||||||
return p;
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonValue& JsonObjectBase::operator[](JsonKey key)
|
|
||||||
{
|
|
||||||
KeyValuePair* match = getMatchingPair(key);
|
|
||||||
|
|
||||||
if (match)
|
|
||||||
return match->value;
|
|
||||||
|
|
||||||
JsonValue* value;
|
|
||||||
|
|
||||||
if (count < capacity)
|
|
||||||
{
|
|
||||||
items[count].key = key;
|
|
||||||
value = &items[count].value;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = &nullValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
value->reset();
|
|
||||||
return *value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JsonObjectBase::containsKey(JsonKey key) const
|
|
||||||
{
|
|
||||||
return getMatchingPair(key) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonObjectBase::remove(JsonKey key)
|
|
||||||
{
|
|
||||||
KeyValuePair* match = getMatchingPair(key);
|
|
||||||
if (match == 0) return;
|
|
||||||
|
|
||||||
*match = items[--count];
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonPrintable.h"
|
|
||||||
#include "EscapedString.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
typedef const char* JsonKey;
|
|
||||||
|
|
||||||
class JsonObjectBase : public JsonPrintable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonValue& operator[](JsonKey);
|
|
||||||
bool containsKey(JsonKey) const;
|
|
||||||
void remove(JsonKey key);
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void add(JsonKey key, T value)
|
|
||||||
{
|
|
||||||
operator[](key) = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void add(JsonKey key, double value)
|
|
||||||
{
|
|
||||||
operator[](key).set<DIGITS>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
using JsonPrintable::printTo;
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
struct KeyValuePair
|
|
||||||
{
|
|
||||||
JsonKey key;
|
|
||||||
JsonValue value;
|
|
||||||
};
|
|
||||||
|
|
||||||
JsonObjectBase(KeyValuePair* items, int capacity)
|
|
||||||
: items(items), capacity(capacity), count(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
KeyValuePair* items;
|
|
||||||
int capacity, count;
|
|
||||||
static JsonValue nullValue;
|
|
||||||
|
|
||||||
KeyValuePair* getMatchingPair(JsonKey key) const;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "Print.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
class JsonPrintable : public Printable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
size_t printTo(char* buffer, size_t bufferSize)
|
|
||||||
{
|
|
||||||
using namespace Internals;
|
|
||||||
|
|
||||||
StringBuilder sb(buffer, bufferSize);
|
|
||||||
return printTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const = 0;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "EscapedString.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t JsonValue::printBoolTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return p.print(c.asBool ? "true" : "false");
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonValue::printLongTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return p.print(c.asLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonValue::printPrintableTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
if (c.asPrintable)
|
|
||||||
return c.asPrintable->printTo(p);
|
|
||||||
else
|
|
||||||
return p.print("null");
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonValue::printStringTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return EscapedString::printTo(c.asString, p);
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "EscapedString.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
class JsonValue
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
void operator=(bool value)
|
|
||||||
{
|
|
||||||
printToImpl = &printBoolTo;
|
|
||||||
content.asBool = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(long value)
|
|
||||||
{
|
|
||||||
printToImpl = &printLongTo;
|
|
||||||
content.asLong = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(int value)
|
|
||||||
{
|
|
||||||
printToImpl = &printLongTo;
|
|
||||||
content.asLong = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(Printable& value)
|
|
||||||
{
|
|
||||||
printToImpl = &printPrintableTo;
|
|
||||||
content.asPrintable = &value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(const char* value)
|
|
||||||
{
|
|
||||||
printToImpl = &printStringTo;
|
|
||||||
content.asString = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(double value)
|
|
||||||
{
|
|
||||||
set<2>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int DIGITS>
|
|
||||||
void set(double value)
|
|
||||||
{
|
|
||||||
printToImpl = &printDoubleTo < DIGITS > ;
|
|
||||||
content.asDouble = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator bool()
|
|
||||||
{
|
|
||||||
return content.asBool;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator const char*()
|
|
||||||
{
|
|
||||||
return content.asString;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator double()
|
|
||||||
{
|
|
||||||
return content.asDouble;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator float()
|
|
||||||
{
|
|
||||||
return (float)content.asDouble;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator int()
|
|
||||||
{
|
|
||||||
return content.asLong;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator long()
|
|
||||||
{
|
|
||||||
return content.asLong;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator Printable&()
|
|
||||||
{
|
|
||||||
return *content.asPrintable;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t printTo(Print& p) const
|
|
||||||
{
|
|
||||||
// handmade polymorphism
|
|
||||||
return printToImpl(content, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset()
|
|
||||||
{
|
|
||||||
content.asDouble = 0;
|
|
||||||
printToImpl = printStringTo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
union Content
|
|
||||||
{
|
|
||||||
bool asBool;
|
|
||||||
double asDouble;
|
|
||||||
long asLong;
|
|
||||||
Printable* asPrintable;
|
|
||||||
const char* asString;
|
|
||||||
};
|
|
||||||
|
|
||||||
Content content;
|
|
||||||
|
|
||||||
size_t(*printToImpl)(const Content&, Print&);
|
|
||||||
|
|
||||||
static size_t printBoolTo(const Content&, Print&);
|
|
||||||
static size_t printLongTo(const Content&, Print&);
|
|
||||||
static size_t printPrintableTo(const Content&, Print&);
|
|
||||||
static size_t printStringTo(const Content&, Print&);
|
|
||||||
|
|
||||||
template <int DIGITS>
|
|
||||||
static size_t printDoubleTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return p.print(c.asDouble, DIGITS);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
#include <cstdio>
|
|
||||||
|
|
||||||
size_t Print::print(const char s[])
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
while (*s)
|
|
||||||
{
|
|
||||||
n += write(*s++);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(double value, int digits)
|
|
||||||
{
|
|
||||||
char tmp[32];
|
|
||||||
sprintf(tmp, "%.*lg", digits+1, value);
|
|
||||||
return print(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(long value)
|
|
||||||
{
|
|
||||||
char tmp[32];
|
|
||||||
sprintf(tmp, "%ld", value);
|
|
||||||
return print(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
|
|
||||||
typedef unsigned char uint8_t;
|
|
||||||
|
|
||||||
// This class reproduces Arduino's Print
|
|
||||||
class Print
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t) = 0;
|
|
||||||
|
|
||||||
size_t print(const char[]);
|
|
||||||
size_t print(double, int = 2);
|
|
||||||
size_t print(long);
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <Print.h>
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
|
|
||||||
class Print;
|
|
||||||
|
|
||||||
class Printable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <Printable.h>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,212 +0,0 @@
|
|||||||
Arduino JSON library - Generator
|
|
||||||
================================
|
|
||||||
|
|
||||||
*An elegant and efficient JSON encoder for embedded systems.*
|
|
||||||
|
|
||||||
It's design to have the most intuitive API, the smallest footprint and works without any allocation on the heap (no malloc).
|
|
||||||
|
|
||||||
It has been written with Arduino in mind, but it isn't linked to Arduino libraries so you can use this library in any other C++ project.
|
|
||||||
|
|
||||||
|
|
||||||
Features
|
|
||||||
--------
|
|
||||||
|
|
||||||
* Elegant API, very easy to use
|
|
||||||
* Fixed memory allocation (no malloc)
|
|
||||||
* Small footprint
|
|
||||||
* Supports nested objects
|
|
||||||
* Implements Arduino's `Printable interface
|
|
||||||
* MIT License
|
|
||||||
|
|
||||||
|
|
||||||
Example
|
|
||||||
-------
|
|
||||||
|
|
||||||
JsonArray<2> array;
|
|
||||||
array.add<6>(48.756080); // <6> specifies the number of digits in the output
|
|
||||||
array.add<6>(2.302038); // (the default is 2)
|
|
||||||
|
|
||||||
JsonObject<3> root;
|
|
||||||
root["sensor"] = "gps";
|
|
||||||
root["time"] = 1351824120;
|
|
||||||
root["data"] = array;
|
|
||||||
|
|
||||||
Serial.print(root); // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
|
|
||||||
|
|
||||||
|
|
||||||
How to use?
|
|
||||||
------------
|
|
||||||
|
|
||||||
### 1. Install the library
|
|
||||||
|
|
||||||
Download the library and extract it to:
|
|
||||||
|
|
||||||
<your Arduino Sketch folder>/libraries/ArduinoJson
|
|
||||||
|
|
||||||
### 2. Import in your sketch
|
|
||||||
|
|
||||||
Just add the following lines at the top of your `.ino` file:
|
|
||||||
|
|
||||||
#include <JsonGenerator.h>
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
> ##### Having a namespace conflict?
|
|
||||||
> To be able to use both `ArduinoJson::Generator` and `ArduinoJson::Parser` in the same file, you need to do one of the followings:
|
|
||||||
>
|
|
||||||
> * Put the `using` statements into different functions
|
|
||||||
> * `using namespace ArduinoJson`, then prefix the type names by `Generator::` or `Parser::`
|
|
||||||
> * Create aliases for the namespaces or the types (C++11 only)
|
|
||||||
|
|
||||||
### 3. Create object tree
|
|
||||||
|
|
||||||
In order to generate a JSON string, you need to build the equivalent object tree. You usually start by the root which can be either a JSON Array or a JSON Object.
|
|
||||||
|
|
||||||
#### JSON Array
|
|
||||||
|
|
||||||
You create an array with the following line:
|
|
||||||
|
|
||||||
JsonArray<8> array;
|
|
||||||
|
|
||||||
See the little `<8>`? It's a template parameter that gives the capacity of the array, it's the maximum number of elements you can put in it.
|
|
||||||
|
|
||||||
> ##### About the capacity
|
|
||||||
> As stated in the feature list, this library works with a fixed memory allocation.
|
|
||||||
> This means that the size of the object must be know at the compilation time, therefore you can **not** use a variable to set the capacity of the array.
|
|
||||||
|
|
||||||
Then you can add strings, integer, booleans, etc:
|
|
||||||
|
|
||||||
array.add("bazinga!");
|
|
||||||
array.add(42);
|
|
||||||
array.add(true);
|
|
||||||
|
|
||||||
There are two syntaxes for floating point values:
|
|
||||||
|
|
||||||
array.add<4>(3.1415); // 4 digits: "3.1415"
|
|
||||||
array.add(3.14); // 2 digits: "3.14"
|
|
||||||
|
|
||||||
> ##### About floating point precision
|
|
||||||
> The overload of `add()` with 2 parameters allows you to specify the number of decimals to save in the JSON string.
|
|
||||||
> When you use the overload with one parameter, you use the default number of decimals which is two.
|
|
||||||
> Note that this behavior is the exact same as Arduino's `Print::print(double,int);` which is implemented by `Serial`.
|
|
||||||
> So you may already be familiar with it.
|
|
||||||
|
|
||||||
Finally you can add nested object to the array:
|
|
||||||
|
|
||||||
JsonArray<8> nestedArray;
|
|
||||||
array.add(nestedArray);
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
JsonObject<8> nestedObject;
|
|
||||||
array.add(nestedObject);
|
|
||||||
|
|
||||||
#### JSON Object
|
|
||||||
|
|
||||||
You create a JSON object (ie hash-table/dictionary) with the following line:
|
|
||||||
|
|
||||||
JsonObject<8> object;
|
|
||||||
|
|
||||||
Like with the array class, there is a template parameter that gives the capacity of the object.
|
|
||||||
|
|
||||||
Then you can add strings, integer, booleans, etc:
|
|
||||||
|
|
||||||
object["key1"] = "bazinga!";
|
|
||||||
object["key2"] = 42;
|
|
||||||
object["key3"] = true;
|
|
||||||
|
|
||||||
As for the arrays, there are two syntaxes for the floating point values:
|
|
||||||
|
|
||||||
object["key4"].set<4>(3.1415); // 4 digits "3.1415"
|
|
||||||
object["key5"] = 3.1415; // default: 2 digits "3.14"
|
|
||||||
|
|
||||||
Finally you can add nested objects:
|
|
||||||
|
|
||||||
JsonArray<8> nestedArray;
|
|
||||||
object["key6"] = nestedArray;
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
JsonObject<8> nestedObject;
|
|
||||||
object["key7"] = nestedObject;
|
|
||||||
|
|
||||||
> ##### Other JsonObject functions
|
|
||||||
> * `object.add(key, value)` is a synonym for `object[key] = value`
|
|
||||||
> * `object.containsKey(key)` returns `true` is the `key` is present in `object`
|
|
||||||
> * `object.remove(key)` removes the `value` associated with `key`
|
|
||||||
|
|
||||||
### 4. Get the JSON string
|
|
||||||
|
|
||||||
There are two ways tho get the resulting JSON string.
|
|
||||||
|
|
||||||
Depending on your project, you may need to dump the string in a classic `char[]` or send it to a stream like `Serial` or `EthernetClient `.
|
|
||||||
|
|
||||||
Both ways are the easy way :-)
|
|
||||||
|
|
||||||
#### Use a classic `char[]`
|
|
||||||
|
|
||||||
Whether you have a `JsonArray` or a `JsonObject`, simply call `printTo()` with the destination buffer, like so:
|
|
||||||
|
|
||||||
char buffer[256];
|
|
||||||
array.printTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
#### Send to a stream
|
|
||||||
|
|
||||||
It's very likely that the generated JSON will end up in a stream like `Serial` or `EthernetClient `, so you can save some time and memory by doing this:
|
|
||||||
|
|
||||||
Serial.print(array);
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
array.printTo(Serial);
|
|
||||||
|
|
||||||
> ##### About the Printable interface
|
|
||||||
> `JsonArray` and `JsonObject` implement Arduino's `Printable` interface.
|
|
||||||
> This is why you can call `Serial.print()` like in the example above.
|
|
||||||
> You can do the same with any other implementation of `Print`: `HardwareSerial`, `SoftwareSerial`, `LiquidCrystal`, `EthernetClient`, `WiFiClient`...
|
|
||||||
|
|
||||||
|
|
||||||
Memory usage
|
|
||||||
------------
|
|
||||||
|
|
||||||
Here are the size of the main classes of the library.
|
|
||||||
|
|
||||||
This table is for an 8-bit Arduino, types would be bigger on a 32-bit processor.
|
|
||||||
|
|
||||||
| Type | Size in bytes |
|
|
||||||
| --------------------| ------------- |
|
|
||||||
| JsonArray<N> | 8 + 6 x N |
|
|
||||||
| JsonObject<N> | 8 + 8 x N |
|
|
||||||
|
|
||||||
|
|
||||||
Code size
|
|
||||||
---------
|
|
||||||
|
|
||||||
The following values has been obtained with Arduino IDE 1.0.5, targeting an Arduino Duelmilanove with an ATmega 328.
|
|
||||||
|
|
||||||
### Minimum setup
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ----------------------------------- | ---- |
|
|
||||||
| `JsonObjectBase::printTo()` | 234 |
|
|
||||||
| `EscapedString::printTo()` | 196 |
|
|
||||||
| `JsonArrayBase::printTo()` | 164 |
|
|
||||||
| `Print::print(char const*)` | 146 |
|
|
||||||
| `JsonObjectBase::operator[]` | 114 |
|
|
||||||
| `JsonObjectBase::getMatchingPair()` | 72 |
|
|
||||||
| `JsonValue::printPrintableTo()` | 40 |
|
|
||||||
| `JsonValue::printStringTo()` | 12 |
|
|
||||||
|
|
||||||
### Additional space for integers
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ---------------------------- | ---- |
|
|
||||||
| `Print::print(long, int)` | 328 |
|
|
||||||
| `JsonValue::printLongTo()` | 22 |
|
|
||||||
|
|
||||||
### Additional space for floating point
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ------------------------------ | ---- |
|
|
||||||
| `Print::print(double, int)` | 1548 |
|
|
||||||
| `JsonValue::printDouleTo<2>()` | 22 |
|
|
@ -1,17 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t StringBuilder::write(uint8_t c)
|
|
||||||
{
|
|
||||||
if (length >= capacity) return 0;
|
|
||||||
|
|
||||||
buffer[length++] = c;
|
|
||||||
buffer[length] = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Internals
|
|
||||||
{
|
|
||||||
class StringBuilder : public Print
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StringBuilder(char* buf, int size)
|
|
||||||
: buffer(buf), capacity(size - 1), length(0)
|
|
||||||
{
|
|
||||||
buffer[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t c);
|
|
||||||
|
|
||||||
private:
|
|
||||||
char* buffer;
|
|
||||||
int capacity;
|
|
||||||
int length;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "EscapedString.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(EscapedStringTests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Null)
|
|
||||||
{
|
|
||||||
whenInputIs(0);
|
|
||||||
outputMustBe("null");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyString)
|
|
||||||
{
|
|
||||||
whenInputIs("");
|
|
||||||
outputMustBe("\"\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(QuotationMark)
|
|
||||||
{
|
|
||||||
whenInputIs("\"");
|
|
||||||
outputMustBe("\"\\\"\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ReverseSolidus)
|
|
||||||
{
|
|
||||||
whenInputIs("\\");
|
|
||||||
outputMustBe("\"\\\\\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Solidus)
|
|
||||||
{
|
|
||||||
whenInputIs("/");
|
|
||||||
outputMustBe("\"/\""); // but the JSON format allows \/
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Backspace)
|
|
||||||
{
|
|
||||||
whenInputIs("\b");
|
|
||||||
outputMustBe("\"\\b\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Formfeed)
|
|
||||||
{
|
|
||||||
whenInputIs("\f");
|
|
||||||
outputMustBe("\"\\f\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Newline)
|
|
||||||
{
|
|
||||||
whenInputIs("\n");
|
|
||||||
outputMustBe("\"\\n\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(CarriageReturn)
|
|
||||||
{
|
|
||||||
whenInputIs("\r");
|
|
||||||
outputMustBe("\"\\r\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(HorizontalTab)
|
|
||||||
{
|
|
||||||
whenInputIs("\t");
|
|
||||||
outputMustBe("\"\\t\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void whenInputIs(const char* input)
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
returnValue = EscapedString::printTo(input, sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,173 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonArrayTests)
|
|
||||||
{
|
|
||||||
JsonArray<2> arr;
|
|
||||||
char buffer[256];
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Empty)
|
|
||||||
{
|
|
||||||
outputMustBe("[]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Null)
|
|
||||||
{
|
|
||||||
add((char*)0);
|
|
||||||
|
|
||||||
outputMustBe("[null]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneString)
|
|
||||||
{
|
|
||||||
add("hello");
|
|
||||||
|
|
||||||
outputMustBe("[\"hello\"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
add("hello");
|
|
||||||
add("world");
|
|
||||||
|
|
||||||
outputMustBe("[\"hello\",\"world\"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneStringOverCapacity)
|
|
||||||
{
|
|
||||||
add("hello");
|
|
||||||
add("world");
|
|
||||||
add("lost");
|
|
||||||
|
|
||||||
outputMustBe("[\"hello\",\"world\"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleDefaultDigits)
|
|
||||||
{
|
|
||||||
add(3.14159265358979323846);
|
|
||||||
outputMustBe("[3.14]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleFourDigits)
|
|
||||||
{
|
|
||||||
add<4>(3.14159265358979323846);
|
|
||||||
outputMustBe("[3.1416]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneInteger)
|
|
||||||
{
|
|
||||||
add(1);
|
|
||||||
|
|
||||||
outputMustBe("[1]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoIntegers)
|
|
||||||
{
|
|
||||||
add(1);
|
|
||||||
add(2);
|
|
||||||
|
|
||||||
outputMustBe("[1,2]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneIntegerOverCapacity)
|
|
||||||
{
|
|
||||||
add(1);
|
|
||||||
add(2);
|
|
||||||
add(3);
|
|
||||||
|
|
||||||
outputMustBe("[1,2]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneTrue)
|
|
||||||
{
|
|
||||||
add(true);
|
|
||||||
|
|
||||||
outputMustBe("[true]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneFalse)
|
|
||||||
{
|
|
||||||
add(false);
|
|
||||||
|
|
||||||
outputMustBe("[false]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoBooleans)
|
|
||||||
{
|
|
||||||
add(false);
|
|
||||||
add(true);
|
|
||||||
|
|
||||||
outputMustBe("[false,true]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneBooleanOverCapacity)
|
|
||||||
{
|
|
||||||
add(false);
|
|
||||||
add(true);
|
|
||||||
add(false);
|
|
||||||
|
|
||||||
outputMustBe("[false,true]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedArray)
|
|
||||||
{
|
|
||||||
addNested(JsonArray<1>());
|
|
||||||
outputMustBe("[[]]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedHash)
|
|
||||||
{
|
|
||||||
addNested(JsonHashTable<1>());
|
|
||||||
outputMustBe("[{}]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneNestedArrayWithOneInteger)
|
|
||||||
{
|
|
||||||
JsonArray<1> nestedArray;
|
|
||||||
nestedArray.add(1);
|
|
||||||
|
|
||||||
addNested(nestedArray);
|
|
||||||
|
|
||||||
outputMustBe("[[1]]");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void addNested(Printable& value)
|
|
||||||
{
|
|
||||||
arr.add<Printable&>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void add(T value)
|
|
||||||
{
|
|
||||||
arr.add(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void add(double value)
|
|
||||||
{
|
|
||||||
arr.add<DIGITS>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
size_t n = arr.printTo(buffer, sizeof(buffer));
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), n);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{B9545D97-E084-4A19-8E48-929157064360}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>JsonGeneratorTests</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<UseOfMfc>false</UseOfMfc>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<UseOfMfc>false</UseOfMfc>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<IncludePath>$(ProjectDir)/../JsonGenerator;$(IncludePath)</IncludePath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<IncludePath>$(ProjectDir)/../JsonGenerator;$(IncludePath)</IncludePath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>ARDUINO_JSON_NO_DEPRECATION_WARNING;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<UseFullPaths>true</UseFullPaths>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<UseFullPaths>true</UseFullPaths>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="EscapedStringTests.cpp" />
|
|
||||||
<ClCompile Include="JsonArrayTests.cpp" />
|
|
||||||
<ClCompile Include="JsonObject_Indexer_Tests.cpp" />
|
|
||||||
<ClCompile Include="JsonObject_PrintTo_Tests.cpp" />
|
|
||||||
<ClCompile Include="JsonValue_Cast_Tests.cpp" />
|
|
||||||
<ClCompile Include="JsonValue_PrintTo_Tests.cpp" />
|
|
||||||
<ClCompile Include="StringBuilderTests.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\JsonGenerator\JsonGenerator.vcxproj">
|
|
||||||
<Project>{c6536d27-738d-4ceb-a2bc-e13c8897d894}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -1,40 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="JsonArrayTests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="StringBuilderTests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="EscapedStringTests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObject_PrintTo_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObject_Indexer_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue_PrintTo_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue_Cast_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonObject_Indexer_Tests)
|
|
||||||
{
|
|
||||||
JsonObject<2> object;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Empty)
|
|
||||||
{
|
|
||||||
mustNotContain("key");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
|
|
||||||
mustContain("key1", "value1");
|
|
||||||
mustContain("key2", "value2");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveFirst)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key1");
|
|
||||||
|
|
||||||
mustNotContain("key1");
|
|
||||||
mustContain("key2", "value2");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveLast)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key2");
|
|
||||||
|
|
||||||
mustContain("key1", "value1");
|
|
||||||
mustNotContain("key2");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void mustContain(const char* key, const char* expected)
|
|
||||||
{
|
|
||||||
Assert::IsTrue(object.containsKey(key));
|
|
||||||
|
|
||||||
const char* actual = object[key];
|
|
||||||
Assert::AreEqual(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mustNotContain(const char* key)
|
|
||||||
{
|
|
||||||
Assert::IsFalse(object.containsKey(key));
|
|
||||||
|
|
||||||
const char* actual = object[key];
|
|
||||||
Assert::IsNull(actual);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,152 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonObject_PrintTo_Tests)
|
|
||||||
{
|
|
||||||
JsonObject<2> object;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Empty)
|
|
||||||
{
|
|
||||||
outputMustBe("{}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneString)
|
|
||||||
{
|
|
||||||
object["key"] = "value";
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":\"value\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveFirst)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key1");
|
|
||||||
|
|
||||||
outputMustBe("{\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveLast)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key2");
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveUnexistingKey)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key3");
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ReplaceExistingKey)
|
|
||||||
{
|
|
||||||
object["key"] = "value1";
|
|
||||||
object["key"] = "value2";
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneStringOverCapacity)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object["key3"] = "value3";
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneInteger)
|
|
||||||
{
|
|
||||||
object["key"] = 1;
|
|
||||||
outputMustBe("{\"key\":1}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleFourDigits)
|
|
||||||
{
|
|
||||||
object["key"].set<4>(3.14159265358979323846);
|
|
||||||
outputMustBe("{\"key\":3.1416}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleDefaultDigits)
|
|
||||||
{
|
|
||||||
object["key"] = 3.14159265358979323846;
|
|
||||||
outputMustBe("{\"key\":3.14}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneNull)
|
|
||||||
{
|
|
||||||
object["key"] = (char*) 0;
|
|
||||||
outputMustBe("{\"key\":null}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneTrue)
|
|
||||||
{
|
|
||||||
object["key"] = true;
|
|
||||||
outputMustBe("{\"key\":true}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneFalse)
|
|
||||||
{
|
|
||||||
object["key"] = false;
|
|
||||||
outputMustBe("{\"key\":false}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedArray)
|
|
||||||
{
|
|
||||||
auto nestedArray = JsonArray<1>();
|
|
||||||
|
|
||||||
object["key"] = nestedArray;
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":[]}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedObject)
|
|
||||||
{
|
|
||||||
auto nestedObject = JsonObject<1>();
|
|
||||||
|
|
||||||
object["key"] = nestedObject;
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":{}}");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
char buffer[256];
|
|
||||||
size_t result;
|
|
||||||
|
|
||||||
result = object.printTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
Assert::AreEqual(strlen(expected), result);
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonValue_Cast_Tests)
|
|
||||||
{
|
|
||||||
JsonValue value;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Bool)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(true);
|
|
||||||
setValueAndCheckCast(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Double)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(3.14156);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Float)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(3.14f);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Integer)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(42);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Long)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(42L);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Array)
|
|
||||||
{
|
|
||||||
JsonArray<2> array;
|
|
||||||
setValueAndCheckCast(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(String)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast("hello");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void setValueAndCheckCast(T expected)
|
|
||||||
{
|
|
||||||
value = expected;
|
|
||||||
T actual = value;
|
|
||||||
Assert::AreEqual(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int N>
|
|
||||||
void setValueAndCheckCast(JsonArray<N>& expected)
|
|
||||||
{
|
|
||||||
value = expected;
|
|
||||||
Printable& actual = value;
|
|
||||||
Assert::AreEqual((void*) &expected, (void*) &actual);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonValue_PrintTo_Tests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(String)
|
|
||||||
{
|
|
||||||
setValueTo("hello");
|
|
||||||
outputMustBe("\"hello\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Float)
|
|
||||||
{
|
|
||||||
setValueTo(3.1415f);
|
|
||||||
outputMustBe("3.14");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(DoubleZeroDigits)
|
|
||||||
{
|
|
||||||
setValueTo<0>(3.14159265358979323846);
|
|
||||||
outputMustBe("3");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(DoubleOneDigit)
|
|
||||||
{
|
|
||||||
setValueTo<1>(3.14159265358979323846);
|
|
||||||
outputMustBe("3.1");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(DoubleTwoDigits)
|
|
||||||
{
|
|
||||||
setValueTo<2>(3.14159265358979323846);
|
|
||||||
outputMustBe("3.14");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Integer)
|
|
||||||
{
|
|
||||||
setValueTo(314);
|
|
||||||
outputMustBe("314");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Char)
|
|
||||||
{
|
|
||||||
setValueTo('A');
|
|
||||||
outputMustBe("65");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Short)
|
|
||||||
{
|
|
||||||
setValueTo((short)314);
|
|
||||||
outputMustBe("314");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Long)
|
|
||||||
{
|
|
||||||
setValueTo(314159265L);
|
|
||||||
outputMustBe("314159265");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void setValueTo(double value)
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
JsonValue jsonValue;
|
|
||||||
jsonValue.set<DIGITS>(value);
|
|
||||||
returnValue = jsonValue.printTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void setValueTo(T value)
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
JsonValue jsonValue;
|
|
||||||
jsonValue = value;
|
|
||||||
returnValue = jsonValue.printTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,85 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(StringBuilderTests)
|
|
||||||
{
|
|
||||||
char buffer[20];
|
|
||||||
Print* sb;
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD_INITIALIZE(Initialize)
|
|
||||||
{
|
|
||||||
sb = new StringBuilder(buffer, sizeof(buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(InitialState)
|
|
||||||
{
|
|
||||||
outputMustBe("");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OverCapacity)
|
|
||||||
{
|
|
||||||
print("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
|
|
||||||
resultMustBe(19);
|
|
||||||
|
|
||||||
print("ABC");
|
|
||||||
resultMustBe(0);
|
|
||||||
|
|
||||||
outputMustBe("ABCDEFGHIJKLMNOPQRS");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyString)
|
|
||||||
{
|
|
||||||
print("");
|
|
||||||
resultMustBe(0);
|
|
||||||
outputMustBe("");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneString)
|
|
||||||
{
|
|
||||||
print("ABCD");
|
|
||||||
resultMustBe(4);
|
|
||||||
outputMustBe("ABCD");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
print("ABCD");
|
|
||||||
resultMustBe(4);
|
|
||||||
|
|
||||||
print("EFGH");
|
|
||||||
resultMustBe(4);
|
|
||||||
|
|
||||||
outputMustBe("ABCDEFGH");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void print(const char* value)
|
|
||||||
{
|
|
||||||
returnValue = sb->print(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void resultMustBe(size_t expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This file is here to help the Arduino IDE find the .cpp files
|
|
||||||
|
|
||||||
#include "JsonParser/JsonArray.cpp"
|
|
||||||
#include "JsonParser/JsonObject.cpp"
|
|
||||||
#include "JsonParser/JsonParserBase.cpp"
|
|
||||||
#include "JsonParser/JsonValue.cpp"
|
|
||||||
#include "JsonParser/JsonToken.cpp"
|
|
||||||
#include "JsonParser/jsmn.cpp"
|
|
@ -1,6 +0,0 @@
|
|||||||
/*
|
|
||||||
* malloc-free JSON parser for Arduino
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonParser/JsonParser.h"
|
|
@ -1,14 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
DEPRECATED JsonObject JsonArray::getHashTable(int index)
|
|
||||||
{
|
|
||||||
return operator[](index);
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "JsonArrayIterator.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
class JsonObject;
|
|
||||||
|
|
||||||
// A JSON array
|
|
||||||
class JsonArray : JsonValue
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create an invalid array
|
|
||||||
JsonArray()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert a JsonValue into a JsonArray
|
|
||||||
JsonArray(JsonValue value)
|
|
||||||
: JsonValue(value)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the array is valid
|
|
||||||
bool success()
|
|
||||||
{
|
|
||||||
return isArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the JsonValue at specified index
|
|
||||||
JsonValue operator[](int index)
|
|
||||||
{
|
|
||||||
return JsonValue::operator[](index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the size of the array
|
|
||||||
int size()
|
|
||||||
{
|
|
||||||
return isArray() ? childrenCount() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get an iterator pointing to the beginning of the array
|
|
||||||
JsonArrayIterator begin()
|
|
||||||
{
|
|
||||||
return isArray() ? firstChild() : null();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets an iterator pointing to the end of the array
|
|
||||||
JsonArrayIterator end()
|
|
||||||
{
|
|
||||||
return isArray() ? nextSibling() : null();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use size() instead
|
|
||||||
DEPRECATED int getLength()
|
|
||||||
{
|
|
||||||
return size();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED JsonArray getArray(int index)
|
|
||||||
{
|
|
||||||
return operator[](index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED bool getBool(int index)
|
|
||||||
{
|
|
||||||
return operator[](index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED double getDouble(int index)
|
|
||||||
{
|
|
||||||
return operator[](index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED JsonObject getHashTable(int index);
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED long getLong(int index)
|
|
||||||
{
|
|
||||||
return operator[](index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED char* getString(int index)
|
|
||||||
{
|
|
||||||
return operator[](index);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "JsonToken.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// An iterator for JsonArray
|
|
||||||
class JsonArrayIterator : JsonToken
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create an iterator pointing at the specified JsonToken
|
|
||||||
JsonArrayIterator(JsonToken token)
|
|
||||||
: JsonToken(token)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move iterator forward
|
|
||||||
void operator++()
|
|
||||||
{
|
|
||||||
*this = JsonArrayIterator(nextSibling());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the value pointed by the iterator
|
|
||||||
JsonValue operator*() const
|
|
||||||
{
|
|
||||||
return JsonValue(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test iterator equality
|
|
||||||
bool operator!= (const JsonArrayIterator& other) const
|
|
||||||
{
|
|
||||||
return JsonToken::operator!=(other);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
DEPRECATED JsonArray JsonObject::getArray(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key);
|
|
||||||
}
|
|
@ -1,102 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "JsonObjectIterator.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
class JsonArray;
|
|
||||||
|
|
||||||
// A JSON Object (ie hash-table/dictionary)
|
|
||||||
class JsonObject : JsonValue
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create an invalid JsonObject
|
|
||||||
JsonObject()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert a JsonValue into a JsonObject
|
|
||||||
JsonObject(JsonValue value)
|
|
||||||
: JsonValue(value)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the object is valid
|
|
||||||
bool success()
|
|
||||||
{
|
|
||||||
return isObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the value associated with the specified key.
|
|
||||||
JsonValue operator[](const char* key)
|
|
||||||
{
|
|
||||||
return JsonValue::operator[](key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the specified key exists in the object.
|
|
||||||
bool containsKey(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key).success();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get an iterator pointing at the beginning of the object
|
|
||||||
JsonObjectIterator begin()
|
|
||||||
{
|
|
||||||
return isObject() ? firstChild() : null();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get an iterator pointing at the end of the object
|
|
||||||
JsonObjectIterator end()
|
|
||||||
{
|
|
||||||
return isObject() ? nextSibling() : null();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED JsonArray getArray(const char* key);
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED bool getBool(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED double getDouble(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED JsonObject getHashTable(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED long getLong(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: Use operator[] instead
|
|
||||||
DEPRECATED char* getString(const char* key)
|
|
||||||
{
|
|
||||||
return operator[](key);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Obsolete: Use JsonObject instead
|
|
||||||
DEPRECATED typedef JsonObject JsonHashTable;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "JsonPair.h"
|
|
||||||
#include "JsonToken.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// An iterator for JsonObject
|
|
||||||
class JsonObjectIterator : JsonToken
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create an iterator pointing at the specified token
|
|
||||||
JsonObjectIterator(JsonToken token)
|
|
||||||
: JsonToken(token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move to the next JsonPair
|
|
||||||
void operator++()
|
|
||||||
{
|
|
||||||
*this = JsonObjectIterator(nextSibling().nextSibling());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the JsonPair pointed by the iterator
|
|
||||||
JsonPair operator*() const
|
|
||||||
{
|
|
||||||
return JsonPair(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test iterator equality
|
|
||||||
bool operator!= (const JsonObjectIterator& other) const
|
|
||||||
{
|
|
||||||
return JsonToken::operator!=(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the key of the JsonPair pointed by the iterator
|
|
||||||
const char* key() const
|
|
||||||
{
|
|
||||||
return operator*().key();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the key of the JsonPair pointed by the iterator
|
|
||||||
JsonValue value() const
|
|
||||||
{
|
|
||||||
return operator*().value();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// A JSON key-value pair, as a part of a JSON object
|
|
||||||
class JsonPair : JsonToken
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// Convert a JsonToken to a JsonPair
|
|
||||||
JsonPair(JsonToken token)
|
|
||||||
: JsonToken(token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the key
|
|
||||||
const char* key()
|
|
||||||
{
|
|
||||||
return getText();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the value
|
|
||||||
JsonValue value()
|
|
||||||
{
|
|
||||||
return nextSibling();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonParserBase.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// The JSON parser.
|
|
||||||
//
|
|
||||||
// You need to specifiy the number of token to be allocated for that parser.
|
|
||||||
//
|
|
||||||
// CAUTION: JsonArray, JsonObject and JsonValue contain pointers to tokens of the
|
|
||||||
// JsonParser, so they need the JsonParser to be in memory to work.
|
|
||||||
// As a result, you must not create JsonArray, JsonObject or JsonValue that have a
|
|
||||||
// longer life that the JsonParser.
|
|
||||||
template <int MAX_TOKENS>
|
|
||||||
class JsonParser : public JsonParserBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonParser()
|
|
||||||
: JsonParserBase(tokens, MAX_TOKENS)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
jsmntok_t tokens[MAX_TOKENS];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,96 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{C15274DE-2695-4DFE-8520-4424223FE6DA}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>JsonParser</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup />
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="jsmn.h" />
|
|
||||||
<ClInclude Include="JsonArray.h" />
|
|
||||||
<ClInclude Include="JsonArrayIterator.h" />
|
|
||||||
<ClInclude Include="JsonObject.h" />
|
|
||||||
<ClInclude Include="JsonObjectIterator.h" />
|
|
||||||
<ClInclude Include="JsonPair.h" />
|
|
||||||
<ClInclude Include="JsonParser.h" />
|
|
||||||
<ClInclude Include="JsonParserBase.h" />
|
|
||||||
<ClInclude Include="JsonToken.h" />
|
|
||||||
<ClInclude Include="JsonValue.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="jsmn.cpp" />
|
|
||||||
<ClCompile Include="JsonArray.cpp" />
|
|
||||||
<ClCompile Include="JsonObject.cpp" />
|
|
||||||
<ClCompile Include="JsonParserBase.cpp" />
|
|
||||||
<ClCompile Include="JsonToken.cpp" />
|
|
||||||
<ClCompile Include="JsonValue.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="JsonParserBase.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonToken.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonValue.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonParser.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="jsmn.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonArray.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonArrayIterator.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonObject.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonObjectIterator.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonPair.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="jsmn.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonArray.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObject.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonParserBase.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonToken.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonParserBase.h"
|
|
||||||
#include "JsonToken.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
JsonValue JsonParserBase::parse(char* json)
|
|
||||||
{
|
|
||||||
jsmn_parser parser;
|
|
||||||
jsmn_init(&parser);
|
|
||||||
|
|
||||||
if (JSMN_SUCCESS != jsmn_parse(&parser, json, tokens, maxTokens))
|
|
||||||
return JsonToken::null();
|
|
||||||
|
|
||||||
return JsonToken(json, tokens);
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// Base class for the JSON parser, in case you want to provide your own buffer
|
|
||||||
class JsonParserBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create a JSON parser using the provided buffer
|
|
||||||
JsonParserBase(jsmntok_t* tokens, int maxTokens)
|
|
||||||
: tokens(tokens), maxTokens(maxTokens)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the JSON string and return a array
|
|
||||||
//
|
|
||||||
// The content of the string may be altered to add '\0' at the
|
|
||||||
// end of string tokens
|
|
||||||
JsonValue parse(char* json);
|
|
||||||
|
|
||||||
// Obsolete: use parse() instead
|
|
||||||
DEPRECATED JsonArray parseArray(char* json)
|
|
||||||
{
|
|
||||||
return parse(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obsolete: use parse() instead
|
|
||||||
DEPRECATED JsonObject parseHashTable(char* json)
|
|
||||||
{
|
|
||||||
return parse(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
jsmntok_t* tokens;
|
|
||||||
int maxTokens;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonToken.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
JsonToken JsonToken::nextSibling() const
|
|
||||||
{
|
|
||||||
// start with current token
|
|
||||||
jsmntok_t* t = token;
|
|
||||||
|
|
||||||
// count the number of token to skip
|
|
||||||
int yetToVisit = 1;
|
|
||||||
|
|
||||||
// skip all nested tokens
|
|
||||||
while (yetToVisit)
|
|
||||||
{
|
|
||||||
yetToVisit += t->size - 1;
|
|
||||||
t++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// build a JsonToken at the new location
|
|
||||||
return JsonToken(json, t);
|
|
||||||
}
|
|
@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "jsmn.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// A pointer to a JSON token
|
|
||||||
class JsonToken
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create a "null" pointer
|
|
||||||
JsonToken()
|
|
||||||
: token(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a pointer to the specified JSON token
|
|
||||||
JsonToken(char* json, jsmntok_t* token)
|
|
||||||
: json(json), token(token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get content of the JSON token
|
|
||||||
char* getText()
|
|
||||||
{
|
|
||||||
json[token->end] = 0;
|
|
||||||
return json + token->start;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the number of children tokens
|
|
||||||
int childrenCount()
|
|
||||||
{
|
|
||||||
return token->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a pointer to the first child of the current token
|
|
||||||
JsonToken firstChild() const
|
|
||||||
{
|
|
||||||
return JsonToken(json, token + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a pointer to the next sibling token (ie skiping the children tokens)
|
|
||||||
JsonToken nextSibling() const;
|
|
||||||
|
|
||||||
// Test equality
|
|
||||||
bool operator!=(const JsonToken& other) const
|
|
||||||
{
|
|
||||||
return token != other.token;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the pointer is "null"
|
|
||||||
bool isValid()
|
|
||||||
{
|
|
||||||
return token != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the JSON token is a JSON object
|
|
||||||
bool isObject()
|
|
||||||
{
|
|
||||||
return token != 0 && token->type == JSMN_OBJECT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the JSON token is a JSON array
|
|
||||||
bool isArray()
|
|
||||||
{
|
|
||||||
return token != 0 && token->type == JSMN_ARRAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the JSON token is a primitive
|
|
||||||
bool isPrimitive()
|
|
||||||
{
|
|
||||||
return token != 0 && token->type == JSMN_PRIMITIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell if the JSON token is a string
|
|
||||||
bool isString()
|
|
||||||
{
|
|
||||||
return token != 0 && token->type == JSMN_STRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Explicit wait to create a "null" JsonToken
|
|
||||||
static JsonToken null()
|
|
||||||
{
|
|
||||||
return JsonToken();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
char* json;
|
|
||||||
jsmntok_t* token;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h> // for strtol, strtod
|
|
||||||
#include <string.h> // for strcmp()
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
// Convert the JsonValue to a bool.
|
|
||||||
// Returns false if the JsonValue is not a primitve.
|
|
||||||
JsonValue::operator bool()
|
|
||||||
{
|
|
||||||
if (!isPrimitive()) return 0;
|
|
||||||
|
|
||||||
char *text = getText();
|
|
||||||
|
|
||||||
// "true"
|
|
||||||
if (text[0] == 't') return true;
|
|
||||||
|
|
||||||
// "false"
|
|
||||||
if (text[0] == 'f') return false;
|
|
||||||
|
|
||||||
// "null"
|
|
||||||
if (text[0] == 'n') return false;
|
|
||||||
|
|
||||||
// number
|
|
||||||
return strtol(text, 0, 0) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the JsonValue to a floating point value.
|
|
||||||
// Returns false if the JsonValue is not a number.
|
|
||||||
JsonValue::operator double()
|
|
||||||
{
|
|
||||||
return isPrimitive() ? strtod(getText(), 0) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the JsonValue to a floating point value.
|
|
||||||
// Returns false if the JsonValue is not a number.
|
|
||||||
JsonValue::operator long()
|
|
||||||
{
|
|
||||||
return isPrimitive() ? strtol(getText(), 0, 0) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the JsonValue to a string.
|
|
||||||
// Returns 0 if the JsonValue is not a string.
|
|
||||||
JsonValue::operator char*()
|
|
||||||
{
|
|
||||||
return isString() || isPrimitive() ? getText() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the nested value at the specified index.
|
|
||||||
// Returns an invalid JsonValue if the current value is not an array.
|
|
||||||
JsonValue JsonValue::operator[](int index)
|
|
||||||
{
|
|
||||||
// sanity check
|
|
||||||
if (index < 0 || !isArray() || index >= childrenCount())
|
|
||||||
return null();
|
|
||||||
|
|
||||||
// skip first token, it's the whole object
|
|
||||||
JsonToken runningToken = firstChild();
|
|
||||||
|
|
||||||
// skip all tokens before the specified index
|
|
||||||
for (int i = 0; i < index; i++)
|
|
||||||
{
|
|
||||||
// move forward: current + nested tokens
|
|
||||||
runningToken = runningToken.nextSibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
return runningToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the nested value matching the specified index.
|
|
||||||
// Returns an invalid JsonValue if the current value is not an object.
|
|
||||||
JsonValue JsonValue::operator[](const char* desiredKey)
|
|
||||||
{
|
|
||||||
// sanity check
|
|
||||||
if (desiredKey == 0 || !isObject())
|
|
||||||
return null();
|
|
||||||
|
|
||||||
// skip first token, it's the whole object
|
|
||||||
JsonToken runningToken = firstChild();
|
|
||||||
|
|
||||||
// scan each keys
|
|
||||||
for (int i = 0; i < childrenCount() / 2; i++)
|
|
||||||
{
|
|
||||||
// get 'key' token string
|
|
||||||
char* key = runningToken.getText();
|
|
||||||
|
|
||||||
// move to the 'value' token
|
|
||||||
runningToken = runningToken.nextSibling();
|
|
||||||
|
|
||||||
// compare with desired name
|
|
||||||
if (strcmp(desiredKey, key) == 0)
|
|
||||||
{
|
|
||||||
// return the value token that follows the key token
|
|
||||||
return runningToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip nested tokens
|
|
||||||
runningToken = runningToken.nextSibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
// nothing found, return NULL
|
|
||||||
return null();
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonToken.h"
|
|
||||||
|
|
||||||
#ifndef ARDUINO_JSON_NO_DEPRECATION_WARNING
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define DEPRECATED __attribute__((deprecated))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define DEPRECATED __declspec(deprecated)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define DEPRECATED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Parser
|
|
||||||
{
|
|
||||||
// A JSON value
|
|
||||||
// Can be converted to string, double, bool, array or object.
|
|
||||||
class JsonValue : protected JsonToken
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Create a invalid value
|
|
||||||
JsonValue()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert a JsonToken to a JsonValue
|
|
||||||
JsonValue(JsonToken token)
|
|
||||||
: JsonToken(token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell is the JsonValue is valid
|
|
||||||
bool success()
|
|
||||||
{
|
|
||||||
return isValid();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the JsonValue to a bool.
|
|
||||||
// Returns false if the JsonValue is not a primitve.
|
|
||||||
operator bool();
|
|
||||||
|
|
||||||
// Convert the JsonValue to a floating point value.
|
|
||||||
// Returns false if the JsonValue is not a number.
|
|
||||||
operator double();
|
|
||||||
|
|
||||||
// Convert the JsonValue to a long integer.
|
|
||||||
// Returns 0 if the JsonValue is not a number.
|
|
||||||
operator long();
|
|
||||||
|
|
||||||
// Convert the JsonValue to a string.
|
|
||||||
// Returns 0 if the JsonValue is not a string.
|
|
||||||
operator char*();
|
|
||||||
|
|
||||||
// Get the nested value at the specified index.
|
|
||||||
// Returns an invalid JsonValue if the current value is not an array.
|
|
||||||
JsonValue operator[](int index);
|
|
||||||
|
|
||||||
// Get the nested value matching the specified index.
|
|
||||||
// Returns an invalid JsonValue if the current value is not an object.
|
|
||||||
JsonValue operator[](const char* key);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,250 +0,0 @@
|
|||||||
Arduino JSON library - Parser
|
|
||||||
=============================
|
|
||||||
|
|
||||||
This library is an thin C++ wrapper around the *jsmn* tokenizer: http://zserge.com/jsmn.html
|
|
||||||
|
|
||||||
It's design to be very lightweight, works without any allocation on the heap (no malloc) and supports nested objects.
|
|
||||||
|
|
||||||
It has been written with Arduino in mind, but it isn't linked to Arduino libraries so you can use this library in any other C++ project.
|
|
||||||
|
|
||||||
|
|
||||||
Features
|
|
||||||
--------
|
|
||||||
|
|
||||||
* Based on the well-proven [jsmn](http://zserge.com/jsmn.html) tokenizer
|
|
||||||
* Supports nested objects
|
|
||||||
* Elegant API, very easy to use
|
|
||||||
* Fixed memory allocation (no malloc)
|
|
||||||
* Small footprint
|
|
||||||
* MIT License
|
|
||||||
|
|
||||||
|
|
||||||
Example
|
|
||||||
-------
|
|
||||||
|
|
||||||
JsonParser<32> parser;
|
|
||||||
char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
|
|
||||||
|
|
||||||
JsonObject root = parser.parse(json);
|
|
||||||
|
|
||||||
char* sensor = root["sensor"];
|
|
||||||
long time = root["time"];
|
|
||||||
double latitude = root["data"][0];
|
|
||||||
double longitude = root["data"][1];
|
|
||||||
|
|
||||||
|
|
||||||
How to use ?
|
|
||||||
-------------
|
|
||||||
|
|
||||||
### 1. Install the library
|
|
||||||
|
|
||||||
Download the library and extract it to:
|
|
||||||
|
|
||||||
<your Arduino Sketch folder>/libraries/ArduinoJson
|
|
||||||
|
|
||||||
### 2. Import in your sketch
|
|
||||||
|
|
||||||
Just add the following lines at the top of your `.ino` file:
|
|
||||||
|
|
||||||
#include <JsonParser.h>
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
> ##### Having a namespace conflict?
|
|
||||||
> To be able to use both `ArduinoJson::Generator` and `ArduinoJson::Parser` in the same file, you need to do one of the followings:
|
|
||||||
>
|
|
||||||
> * Put the `using` statements into different functions
|
|
||||||
> * `using namespace ArduinoJson`, then prefix the type names by `Generator::` or `Parser::`
|
|
||||||
> * Create aliases for the namespaces or the types (C++11 only)
|
|
||||||
|
|
||||||
### 3. Create a parser
|
|
||||||
|
|
||||||
To extract data from the JSON string, you need to create a `JsonParser`, and specify the number of token you allocate for the parser itself:
|
|
||||||
|
|
||||||
JsonParser<32> parser;
|
|
||||||
|
|
||||||
> #### How to choose the number of tokens ?
|
|
||||||
|
|
||||||
> A token is an element of the JSON object: either a key, a value, an object or an array.
|
|
||||||
> As an example the `char json[]` on the top of this page contains 12 tokens (don't forget to count 1 for the whole object and 1 more for the array itself).
|
|
||||||
|
|
||||||
> The more tokens you allocate, the more complex the JSON can be, but also the more memory is occupied.
|
|
||||||
> Each token takes 8 bytes, so `sizeof(JsonParser<32>)` is 256 bytes which is quite big in an Arduino with only 2KB of RAM.
|
|
||||||
> Don't forget that you also have to store the JSON string in RAM and it's probably big.
|
|
||||||
|
|
||||||
> 32 tokens may seem small, but it's very decent for an 8-bit processor, you wouldn't get better results with other JSON libraries.
|
|
||||||
|
|
||||||
### 4. Extract data
|
|
||||||
|
|
||||||
To use this library, you need to know beforehand what is the type of data contained in the JSON string, which is very likely.
|
|
||||||
|
|
||||||
The root object has to be either an object (like `{"key":"value"}`) or an array (like `[1,2]`).
|
|
||||||
|
|
||||||
The nested objects can be either arrays, booleans, objects, numbers or strings.
|
|
||||||
If you need other type, you can get the string value and parse it yourself.
|
|
||||||
|
|
||||||
#### Object
|
|
||||||
|
|
||||||
Consider we have a `char json[]` containing to the following JSON string:
|
|
||||||
|
|
||||||
{
|
|
||||||
"sensor":"gps",
|
|
||||||
"time":1351824120,
|
|
||||||
"data":[48.756080,2.302038]
|
|
||||||
}
|
|
||||||
|
|
||||||
In this case the string contains a JSON object, so you need to extract a `JsonObject`:
|
|
||||||
|
|
||||||
JsonObject root = parser.parse(json);
|
|
||||||
|
|
||||||
To check if the parsing was successful, you must check:
|
|
||||||
|
|
||||||
if (!root.success())
|
|
||||||
{
|
|
||||||
// Parsing fail: could be an invalid JSON, or too many tokens
|
|
||||||
}
|
|
||||||
|
|
||||||
And then extract the member you need:
|
|
||||||
|
|
||||||
char* sensor = root["sensor"];
|
|
||||||
long time = root["time"];
|
|
||||||
double latitude = root["data"][0];
|
|
||||||
double longitude = root["data"][1];
|
|
||||||
|
|
||||||
You can also iterate through the key-value pairs of the object:
|
|
||||||
|
|
||||||
for (JsonObjectIterator i=root.begin(); i!=root.end(); ++i)
|
|
||||||
{
|
|
||||||
Serial.println(i.key());
|
|
||||||
Serial.println((char*)i.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
#### Array
|
|
||||||
|
|
||||||
Consider we have a `char json[]` containing to the following JSON string:
|
|
||||||
|
|
||||||
[
|
|
||||||
[ 1.2, 3.4 ],
|
|
||||||
[ 5.6, 7.8 ]
|
|
||||||
]
|
|
||||||
|
|
||||||
In this case the root object of the JSON string is an array, so you need to extract a `JsonArray`:
|
|
||||||
|
|
||||||
JsonArray root = parser.parse(json);
|
|
||||||
|
|
||||||
To check if the parsing was successful, you must check:
|
|
||||||
|
|
||||||
if (!root.success())
|
|
||||||
{
|
|
||||||
// Parsing fail: could be an invalid JSON, or too many tokens
|
|
||||||
}
|
|
||||||
|
|
||||||
And then extract the content by its index in the array:
|
|
||||||
|
|
||||||
double a = root[0][0];
|
|
||||||
double b = root[0][1];
|
|
||||||
double c = root[1][0];
|
|
||||||
double d = root[1][1];
|
|
||||||
|
|
||||||
You can also iterate through the key-value pairs of the object:
|
|
||||||
|
|
||||||
for (JsonArrayIterator i=array.begin(); i!=array.end(); ++i)
|
|
||||||
{
|
|
||||||
Serial.println((char*)*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
Common pitfalls
|
|
||||||
---------------
|
|
||||||
|
|
||||||
### 1. Not enough tokens
|
|
||||||
|
|
||||||
By design, the library has no way to tell you why `JsonParser::parse()` failed.
|
|
||||||
|
|
||||||
There are basically two reasons why they may fail:
|
|
||||||
|
|
||||||
1. the JSON string is invalid
|
|
||||||
2. the JSON string contains more tokens that the parser can store
|
|
||||||
|
|
||||||
So, if you are sure the JSON string is correct and you still can't parse it, you should slightly increase the number of token of the parser.
|
|
||||||
|
|
||||||
### 2. Not enough memory
|
|
||||||
|
|
||||||
You may go into unpredictable trouble if you allocate more memory than your processor really has.
|
|
||||||
It's a very common issue in embedded development.
|
|
||||||
|
|
||||||
To diagnose this, look at every big objects in you code and sum their size to check that they fit in RAM.
|
|
||||||
|
|
||||||
For example, don't do this:
|
|
||||||
|
|
||||||
char json[1024]; // 1 KB
|
|
||||||
JsonParser<64> parser; // 512 B
|
|
||||||
|
|
||||||
because it may be too big for a processor with only 2 KB: you need free memory to store other variables and the call stack.
|
|
||||||
|
|
||||||
That is why an 8-bit processor is not able to parse long and complex JSON strings.
|
|
||||||
|
|
||||||
### 3. JsonParser not in memory
|
|
||||||
|
|
||||||
To reduce the memory consumption, `JsonValue`, `JsonArray` and `JsonObject` contains pointer to the token that are inside the `JsonParser`. This can only work if the `JsonParser` is still in memory.
|
|
||||||
|
|
||||||
For example, don't do this:
|
|
||||||
|
|
||||||
JsonArray getArray(char* json)
|
|
||||||
{
|
|
||||||
JsonParser<16> parser;
|
|
||||||
return parser.parseArray(parser);
|
|
||||||
}
|
|
||||||
|
|
||||||
because the local variable `parser` will be *removed* from memory when the function `getArray()` returns, and the pointer inside `JsonArray` will point to an invalid location.
|
|
||||||
|
|
||||||
### 4. JSON string is altered
|
|
||||||
|
|
||||||
This will probably never be an issue, but you need to be aware of this feature.
|
|
||||||
|
|
||||||
When you pass a `char[]` to `JsonParser::parse()`, the content of the string will be altered to add `\0` at the end of the tokens.
|
|
||||||
|
|
||||||
This is because we want functions like `JsonArray::getString()` to return a null-terminating string without any memory allocation.
|
|
||||||
|
|
||||||
|
|
||||||
Memory usage
|
|
||||||
------------
|
|
||||||
|
|
||||||
Here are the size of the main classes of the library.
|
|
||||||
|
|
||||||
This table is for an 8-bit Arduino, types would be bigger on a 32-bit processor.
|
|
||||||
|
|
||||||
| Type | Size in bytes |
|
|
||||||
| ------------ | ------------- |
|
|
||||||
| `Parser<N>` | 4 + 8 x N |
|
|
||||||
| `JsonArray` | 4 |
|
|
||||||
| `JsonObject` | 4 |
|
|
||||||
| `JsonValue` | 4 |
|
|
||||||
|
|
||||||
Code size
|
|
||||||
---------
|
|
||||||
|
|
||||||
The sizes have been obtained with Arduino IDE 1.0.5 for a Duemilanove.
|
|
||||||
|
|
||||||
### Minimum setup
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ------------------------------------ | ---- |
|
|
||||||
| `jsmn_parse()` | 962 |
|
|
||||||
| `JsonValue::operator[](char const*)` | 218 |
|
|
||||||
| `JsonParserBase::parse()` | 116 |
|
|
||||||
| `JsonValue::operator[](int)` | 108 |
|
|
||||||
| `strcmp()` | 18 |
|
|
||||||
|
|
||||||
### Additional space for integers
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ---------------------------- | ---- |
|
|
||||||
| `strtol()` | 606 |
|
|
||||||
| `JsonValue::operator long()` | 94 |
|
|
||||||
|
|
||||||
### Additional space for floating points
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| -------------------------------- | ----- |
|
|
||||||
| `strtod()` | 1369 |
|
|
||||||
| `JsonValue::operator double()` | 82 |
|
|
@ -1,255 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "jsmn.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates a fresh unused token from the token pull.
|
|
||||||
*/
|
|
||||||
static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
|
|
||||||
jsmntok_t *tokens, size_t num_tokens) {
|
|
||||||
jsmntok_t *tok;
|
|
||||||
if (parser->toknext >= num_tokens) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
tok = &tokens[parser->toknext++];
|
|
||||||
tok->start = tok->end = -1;
|
|
||||||
tok->size = 0;
|
|
||||||
#ifdef JSMN_PARENT_LINKS
|
|
||||||
tok->parent = -1;
|
|
||||||
#endif
|
|
||||||
return tok;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fills token type and boundaries.
|
|
||||||
*/
|
|
||||||
static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
|
|
||||||
int start, int end) {
|
|
||||||
token->type = type;
|
|
||||||
token->start = start;
|
|
||||||
token->end = end;
|
|
||||||
token->size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fills next available token with JSON primitive.
|
|
||||||
*/
|
|
||||||
static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js,
|
|
||||||
jsmntok_t *tokens, size_t num_tokens) {
|
|
||||||
jsmntok_t *token;
|
|
||||||
int start;
|
|
||||||
|
|
||||||
start = parser->pos;
|
|
||||||
|
|
||||||
for (; js[parser->pos] != '\0'; parser->pos++) {
|
|
||||||
switch (js[parser->pos]) {
|
|
||||||
#ifndef JSMN_STRICT
|
|
||||||
/* In strict mode primitive must be followed by "," or "}" or "]" */
|
|
||||||
case ':':
|
|
||||||
#endif
|
|
||||||
case '\t' : case '\r' : case '\n' : case ' ' :
|
|
||||||
case ',' : case ']' : case '}' :
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
|
|
||||||
parser->pos = start;
|
|
||||||
return JSMN_ERROR_INVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef JSMN_STRICT
|
|
||||||
/* In strict mode primitive must be followed by a comma/object/array */
|
|
||||||
parser->pos = start;
|
|
||||||
return JSMN_ERROR_PART;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
found:
|
|
||||||
token = jsmn_alloc_token(parser, tokens, num_tokens);
|
|
||||||
if (token == NULL) {
|
|
||||||
parser->pos = start;
|
|
||||||
return JSMN_ERROR_NOMEM;
|
|
||||||
}
|
|
||||||
jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
|
|
||||||
#ifdef JSMN_PARENT_LINKS
|
|
||||||
token->parent = parser->toksuper;
|
|
||||||
#endif
|
|
||||||
parser->pos--;
|
|
||||||
return JSMN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filsl next token with JSON string.
|
|
||||||
*/
|
|
||||||
static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js,
|
|
||||||
jsmntok_t *tokens, size_t num_tokens) {
|
|
||||||
jsmntok_t *token;
|
|
||||||
|
|
||||||
int start = parser->pos;
|
|
||||||
|
|
||||||
parser->pos++;
|
|
||||||
|
|
||||||
/* Skip starting quote */
|
|
||||||
for (; js[parser->pos] != '\0'; parser->pos++) {
|
|
||||||
char c = js[parser->pos];
|
|
||||||
|
|
||||||
/* Quote: end of string */
|
|
||||||
if (c == '\"') {
|
|
||||||
token = jsmn_alloc_token(parser, tokens, num_tokens);
|
|
||||||
if (token == NULL) {
|
|
||||||
parser->pos = start;
|
|
||||||
return JSMN_ERROR_NOMEM;
|
|
||||||
}
|
|
||||||
jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
|
|
||||||
#ifdef JSMN_PARENT_LINKS
|
|
||||||
token->parent = parser->toksuper;
|
|
||||||
#endif
|
|
||||||
return JSMN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Backslash: Quoted symbol expected */
|
|
||||||
if (c == '\\') {
|
|
||||||
parser->pos++;
|
|
||||||
switch (js[parser->pos]) {
|
|
||||||
/* Allowed escaped symbols */
|
|
||||||
case '\"': case '/' : case '\\' : case 'b' :
|
|
||||||
case 'f' : case 'r' : case 'n' : case 't' :
|
|
||||||
break;
|
|
||||||
/* Allows escaped symbol \uXXXX */
|
|
||||||
case 'u':
|
|
||||||
/* TODO */
|
|
||||||
break;
|
|
||||||
/* Unexpected symbol */
|
|
||||||
default:
|
|
||||||
parser->pos = start;
|
|
||||||
return JSMN_ERROR_INVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parser->pos = start;
|
|
||||||
return JSMN_ERROR_PART;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse JSON string and fill tokens.
|
|
||||||
*/
|
|
||||||
jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, jsmntok_t *tokens,
|
|
||||||
unsigned int num_tokens) {
|
|
||||||
jsmnerr_t r;
|
|
||||||
int i;
|
|
||||||
jsmntok_t *token;
|
|
||||||
|
|
||||||
for (; js[parser->pos] != '\0'; parser->pos++) {
|
|
||||||
char c;
|
|
||||||
jsmntype_t type;
|
|
||||||
|
|
||||||
c = js[parser->pos];
|
|
||||||
switch (c) {
|
|
||||||
case '{': case '[':
|
|
||||||
token = jsmn_alloc_token(parser, tokens, num_tokens);
|
|
||||||
if (token == NULL)
|
|
||||||
return JSMN_ERROR_NOMEM;
|
|
||||||
if (parser->toksuper != -1) {
|
|
||||||
tokens[parser->toksuper].size++;
|
|
||||||
#ifdef JSMN_PARENT_LINKS
|
|
||||||
token->parent = parser->toksuper;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
|
|
||||||
token->start = parser->pos;
|
|
||||||
parser->toksuper = parser->toknext - 1;
|
|
||||||
break;
|
|
||||||
case '}': case ']':
|
|
||||||
type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
|
|
||||||
#ifdef JSMN_PARENT_LINKS
|
|
||||||
if (parser->toknext < 1) {
|
|
||||||
return JSMN_ERROR_INVAL;
|
|
||||||
}
|
|
||||||
token = &tokens[parser->toknext - 1];
|
|
||||||
for (;;) {
|
|
||||||
if (token->start != -1 && token->end == -1) {
|
|
||||||
if (token->type != type) {
|
|
||||||
return JSMN_ERROR_INVAL;
|
|
||||||
}
|
|
||||||
token->end = parser->pos + 1;
|
|
||||||
parser->toksuper = token->parent;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (token->parent == -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
token = &tokens[token->parent];
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for (i = parser->toknext - 1; i >= 0; i--) {
|
|
||||||
token = &tokens[i];
|
|
||||||
if (token->start != -1 && token->end == -1) {
|
|
||||||
if (token->type != type) {
|
|
||||||
return JSMN_ERROR_INVAL;
|
|
||||||
}
|
|
||||||
parser->toksuper = -1;
|
|
||||||
token->end = parser->pos + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Error if unmatched closing bracket */
|
|
||||||
if (i == -1) return JSMN_ERROR_INVAL;
|
|
||||||
for (; i >= 0; i--) {
|
|
||||||
token = &tokens[i];
|
|
||||||
if (token->start != -1 && token->end == -1) {
|
|
||||||
parser->toksuper = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case '\"':
|
|
||||||
r = jsmn_parse_string(parser, js, tokens, num_tokens);
|
|
||||||
if (r < 0) return r;
|
|
||||||
if (parser->toksuper != -1)
|
|
||||||
tokens[parser->toksuper].size++;
|
|
||||||
break;
|
|
||||||
case '\t' : case '\r' : case '\n' : case ':' : case ',': case ' ':
|
|
||||||
break;
|
|
||||||
#ifdef JSMN_STRICT
|
|
||||||
/* In strict mode primitives are: numbers and booleans */
|
|
||||||
case '-': case '0': case '1' : case '2': case '3' : case '4':
|
|
||||||
case '5': case '6': case '7' : case '8': case '9':
|
|
||||||
case 't': case 'f': case 'n' :
|
|
||||||
#else
|
|
||||||
/* In non-strict mode every unquoted value is a primitive */
|
|
||||||
default:
|
|
||||||
#endif
|
|
||||||
r = jsmn_parse_primitive(parser, js, tokens, num_tokens);
|
|
||||||
if (r < 0) return r;
|
|
||||||
if (parser->toksuper != -1)
|
|
||||||
tokens[parser->toksuper].size++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef JSMN_STRICT
|
|
||||||
/* Unexpected char in strict mode */
|
|
||||||
default:
|
|
||||||
return JSMN_ERROR_INVAL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = parser->toknext - 1; i >= 0; i--) {
|
|
||||||
/* Unmatched opened object or array */
|
|
||||||
if (tokens[i].start != -1 && tokens[i].end == -1) {
|
|
||||||
return JSMN_ERROR_PART;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return JSMN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new parser based over a given buffer with an array of tokens
|
|
||||||
* available.
|
|
||||||
*/
|
|
||||||
void jsmn_init(jsmn_parser *parser) {
|
|
||||||
parser->pos = 0;
|
|
||||||
parser->toknext = 0;
|
|
||||||
parser->toksuper = -1;
|
|
||||||
}
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
|||||||
#ifndef __JSMN_H_
|
|
||||||
#define __JSMN_H_
|
|
||||||
|
|
||||||
/**
|
|
||||||
* JSON type identifier. Basic types are:
|
|
||||||
* o Object
|
|
||||||
* o Array
|
|
||||||
* o String
|
|
||||||
* o Other primitive: number, boolean (true/false) or null
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
JSMN_PRIMITIVE = 0,
|
|
||||||
JSMN_OBJECT = 1,
|
|
||||||
JSMN_ARRAY = 2,
|
|
||||||
JSMN_STRING = 3
|
|
||||||
} jsmntype_t;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
/* Not enough tokens were provided */
|
|
||||||
JSMN_ERROR_NOMEM = -1,
|
|
||||||
/* Invalid character inside JSON string */
|
|
||||||
JSMN_ERROR_INVAL = -2,
|
|
||||||
/* The string is not a full JSON packet, more bytes expected */
|
|
||||||
JSMN_ERROR_PART = -3,
|
|
||||||
/* Everything was fine */
|
|
||||||
JSMN_SUCCESS = 0
|
|
||||||
} jsmnerr_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* JSON token description.
|
|
||||||
* @param type type (object, array, string etc.)
|
|
||||||
* @param start start position in JSON data string
|
|
||||||
* @param end end position in JSON data string
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
jsmntype_t type;
|
|
||||||
int start;
|
|
||||||
int end;
|
|
||||||
int size;
|
|
||||||
#ifdef JSMN_PARENT_LINKS
|
|
||||||
int parent;
|
|
||||||
#endif
|
|
||||||
} jsmntok_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* JSON parser. Contains an array of token blocks available. Also stores
|
|
||||||
* the string being parsed now and current position in that string
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
unsigned int pos; /* offset in the JSON string */
|
|
||||||
int toknext; /* next token to allocate */
|
|
||||||
int toksuper; /* superior token node, e.g parent object or array */
|
|
||||||
} jsmn_parser;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create JSON parser over an array of tokens
|
|
||||||
*/
|
|
||||||
void jsmn_init(jsmn_parser *parser);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run JSON parser. It parses a JSON data string into and array of tokens, each describing
|
|
||||||
* a single JSON object.
|
|
||||||
*/
|
|
||||||
jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js,
|
|
||||||
jsmntok_t *tokens, unsigned int num_tokens);
|
|
||||||
|
|
||||||
#endif /* __JSMN_H_ */
|
|
@ -1,244 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonParser.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
namespace ArduinoJsonParserTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(GbathreeBug)
|
|
||||||
{
|
|
||||||
char json[1024];
|
|
||||||
JsonParser<200> parser;
|
|
||||||
JsonHashTable root;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD_INITIALIZE(Initialize)
|
|
||||||
{
|
|
||||||
// BUG described here:
|
|
||||||
// http://forum.arduino.cc/index.php?topic=172578.msg1608219#msg1608219
|
|
||||||
strcpy(json, "{ \"protocol_name\":\"fluorescence\",\"repeats\":1,\"wait\":0,\"averages\":1,\"measurements\":3,\"meas2_light\":15,\"meas1_baseline\":0,\"act_light\":20,\"pulsesize\":25,\"pulsedistance\":10000,\"actintensity1\":50,\"actintensity2\":255,\"measintensity\":255,\"calintensity\":255,\"pulses\":[50,50,50],\"act\":[2,1,2,2],\"red\":[2,2,2,2],\"detectors\":[[34,34,34,34],[34,34,34,34],[34,34,34,34],[34,34,34,34]],\"alta\":[2,2,2,2],\"altb\":[2,2,2,2],\"measlights\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]],\"measlights2\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]],\"altc\":[2,2,2,2],\"altd\":[2,2,2,2]}");
|
|
||||||
root = parser.parseHashTable(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Root)
|
|
||||||
{
|
|
||||||
Assert::IsTrue(root.success());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ProtocolName)
|
|
||||||
{
|
|
||||||
string protocol_name = root.getString("protocol_name");
|
|
||||||
Assert::AreEqual(string("fluorescence"), protocol_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Repeats)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(1L, root.getLong("repeats"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Wait)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(0L, root.getLong("wait"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Measurements)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(3L, root.getLong("measurements"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Meas2_Light)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(15L, root.getLong("meas2_light"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Meas1_Baseline)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(0L, root.getLong("meas1_baseline"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Act_Light)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(20L, root.getLong("act_light"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Pulsesize)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(25L, root.getLong("pulsesize"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Pulsedistance)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(10000L, root.getLong("pulsedistance"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Actintensity1)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(50L, root.getLong("actintensity1"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Actintensity2)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(255L, root.getLong("actintensity2"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Measintensity)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(255L, root.getLong("measintensity"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Calintensity)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(255L, root.getLong("calintensity"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Pulses)
|
|
||||||
{
|
|
||||||
// "pulses":[50,50,50]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("pulses");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
|
|
||||||
Assert::AreEqual(3, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(50L, array.getLong(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Act)
|
|
||||||
{
|
|
||||||
// "act":[2,1,2,2]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("act");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
Assert::AreEqual(2L, array.getLong(0));
|
|
||||||
Assert::AreEqual(1L, array.getLong(1));
|
|
||||||
Assert::AreEqual(2L, array.getLong(2));
|
|
||||||
Assert::AreEqual(2L, array.getLong(3));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Detectors)
|
|
||||||
{
|
|
||||||
// "detectors":[[34,34,34,34],[34,34,34,34],[34,34,34,34],[34,34,34,34]]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("detectors");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(4, array.getArray(i).getLength());
|
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++)
|
|
||||||
Assert::AreEqual(34L, array.getArray(i).getLong(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Alta)
|
|
||||||
{
|
|
||||||
// alta:[2,2,2,2]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("alta");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(2L, array.getLong(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Altb)
|
|
||||||
{
|
|
||||||
// altb:[2,2,2,2]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("altb");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(2L, array.getLong(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Measlights)
|
|
||||||
{
|
|
||||||
// "measlights":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("measlights");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(4, array.getArray(i).getLength());
|
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++)
|
|
||||||
Assert::AreEqual(15L, array.getArray(i).getLong(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Measlights2)
|
|
||||||
{
|
|
||||||
// "measlights2":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("measlights2");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(4, array.getArray(i).getLength());
|
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++)
|
|
||||||
Assert::AreEqual(15L, array.getArray(i).getLong(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Altc)
|
|
||||||
{
|
|
||||||
// altc:[2,2,2,2]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("altc");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(2L, array.getLong(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Altd)
|
|
||||||
{
|
|
||||||
// altd:[2,2,2,2]
|
|
||||||
|
|
||||||
JsonArray array = root.getArray("altd");
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
|
|
||||||
Assert::AreEqual(4, array.getLength());
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(2L, array.getLong(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonParser.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
namespace JsonParserTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonArrayIteratorTests)
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyJson)
|
|
||||||
{
|
|
||||||
char json[] = "";
|
|
||||||
JsonParser<1> parser;
|
|
||||||
|
|
||||||
JsonArray a = parser.parse(json);
|
|
||||||
|
|
||||||
int loopCount = 0;
|
|
||||||
|
|
||||||
for (long i : a)
|
|
||||||
{
|
|
||||||
loopCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert::AreEqual(0, loopCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ThreeIntegers)
|
|
||||||
{
|
|
||||||
char json [] = "[1,2,3]";
|
|
||||||
long expected [] = {1, 2, 3};
|
|
||||||
JsonParser<4> parser;
|
|
||||||
|
|
||||||
JsonArray a = parser.parse(json);
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
for (long i : a)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected[index++], i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ThreeStrings)
|
|
||||||
{
|
|
||||||
char json[] = "[\"1\",\"2\",\"3\"]";
|
|
||||||
char* expected[] = {"1", "2", "3"};
|
|
||||||
JsonParser<4> parser;
|
|
||||||
|
|
||||||
JsonArray a = parser.parse(json);
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
for (const char* i : a)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected[index++], i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,195 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonParser.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Parser;
|
|
||||||
|
|
||||||
namespace ArduinoJsonParserTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonArrayTests)
|
|
||||||
{
|
|
||||||
JsonArray array;
|
|
||||||
char json[256];
|
|
||||||
jsmntok_t tokens[32];
|
|
||||||
JsonParserBase parser = JsonParserBase(tokens, 32);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyString)
|
|
||||||
{
|
|
||||||
whenInputIs("");
|
|
||||||
parseMustFail();
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TooFewClosingBrackets)
|
|
||||||
{
|
|
||||||
whenInputIs("[[]");
|
|
||||||
parseMustFail();
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TooManyClosingBrackets)
|
|
||||||
{
|
|
||||||
whenInputIs("[]]");
|
|
||||||
parseMustFail();
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyArray)
|
|
||||||
{
|
|
||||||
whenInputIs("[]");
|
|
||||||
parseMustSucceed();
|
|
||||||
lengthMustBe(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(NotEnoughTokens)
|
|
||||||
{
|
|
||||||
setTokenCountTo(2);
|
|
||||||
|
|
||||||
whenInputIs("[1,2]");
|
|
||||||
|
|
||||||
parseMustFail();
|
|
||||||
itemMustNotExist(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoIntegers)
|
|
||||||
{
|
|
||||||
setTokenCountTo(3);
|
|
||||||
|
|
||||||
whenInputIs("[1,2]");
|
|
||||||
|
|
||||||
parseMustSucceed();
|
|
||||||
lengthMustBe(2);
|
|
||||||
itemMustBe(0, 1L);
|
|
||||||
itemMustBe(1, 2L);
|
|
||||||
itemMustNotExist(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoBooleans)
|
|
||||||
{
|
|
||||||
setTokenCountTo(3);
|
|
||||||
|
|
||||||
whenInputIs("[true,false]");
|
|
||||||
|
|
||||||
parseMustSucceed();
|
|
||||||
lengthMustBe(2);
|
|
||||||
itemMustBe(0, true);
|
|
||||||
itemMustBe(1, false);
|
|
||||||
itemMustNotExist(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
setTokenCountTo(3);
|
|
||||||
|
|
||||||
whenInputIs("[\"hello\",\"world\"]");
|
|
||||||
|
|
||||||
parseMustSucceed();
|
|
||||||
lengthMustBe(2);
|
|
||||||
itemMustBe(0, "hello");
|
|
||||||
itemMustBe(1, "world");
|
|
||||||
itemMustNotExist(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoDimensionsArray)
|
|
||||||
{
|
|
||||||
setTokenCountTo(7);
|
|
||||||
|
|
||||||
whenInputIs("[[1,2],[3,4]]");
|
|
||||||
|
|
||||||
parseMustSucceed();
|
|
||||||
lengthMustBe(2);
|
|
||||||
itemMustBe(0, 0, 1L);
|
|
||||||
itemMustBe(0, 1, 2L);
|
|
||||||
itemMustBe(1, 0, 3L);
|
|
||||||
itemMustBe(1, 1, 4L);
|
|
||||||
itemMustNotExist(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ThreeDimensionsArray)
|
|
||||||
{
|
|
||||||
setTokenCountTo(15);
|
|
||||||
|
|
||||||
whenInputIs("[[[1,2],[3,4]],[[5,6],[7,8]]]");
|
|
||||||
|
|
||||||
parseMustSucceed();
|
|
||||||
lengthMustBe(2);
|
|
||||||
itemMustBe(0, 0, 0, 1L);
|
|
||||||
itemMustBe(0, 0, 1, 2L);
|
|
||||||
itemMustBe(0, 1, 0, 3L);
|
|
||||||
itemMustBe(0, 1, 1, 4L);
|
|
||||||
itemMustBe(1, 0, 0, 5L);
|
|
||||||
itemMustBe(1, 0, 1, 6L);
|
|
||||||
itemMustBe(1, 1, 0, 7L);
|
|
||||||
itemMustBe(1, 1, 1, 8L);
|
|
||||||
itemMustNotExist(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void setTokenCountTo(int n)
|
|
||||||
{
|
|
||||||
parser = JsonParserBase(tokens, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
void whenInputIs(const char* input)
|
|
||||||
{
|
|
||||||
strcpy(json, input);
|
|
||||||
array = parser.parseArray(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
void parseMustFail()
|
|
||||||
{
|
|
||||||
Assert::IsFalse(array.success());
|
|
||||||
lengthMustBe(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void parseMustSucceed()
|
|
||||||
{
|
|
||||||
Assert::IsTrue(array.success());
|
|
||||||
}
|
|
||||||
|
|
||||||
void lengthMustBe(int expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, array.getLength());
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemMustBe(int index, long expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, array.getLong(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemMustBe(int index, bool expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, array.getBool(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemMustBe(int index, const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, array.getString(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemMustBe(int index0, int index1, long expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, array.getArray(index0).getLong(index1));
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemMustBe(int index0, int index1, int index2, long expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, array.getArray(index0).getArray(index1).getLong(index2));
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemMustNotExist(int index)
|
|
||||||
{
|
|
||||||
Assert::IsFalse(array.getHashTable(index).success());
|
|
||||||
Assert::IsFalse(array.getArray(index).success());
|
|
||||||
Assert::IsFalse(array.getBool(index));
|
|
||||||
Assert::AreEqual(0.0, array.getDouble(index));
|
|
||||||
Assert::AreEqual(0L, array.getLong(index));
|
|
||||||
Assert::IsNull(array.getString(index));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user