deserializeJsonArray.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. TEST_CASE("deserialize JSON array") {
  7. DynamicJsonDocument doc;
  8. SECTION("An empty array") {
  9. DeserializationError err = deserializeJson(doc, "[]");
  10. JsonArray& arr = doc.as<JsonArray>();
  11. REQUIRE(err == DeserializationError::Ok);
  12. REQUIRE(0 == arr.size());
  13. }
  14. SECTION("Spaces") {
  15. SECTION("Before the opening bracket") {
  16. DeserializationError err = deserializeJson(doc, " []");
  17. JsonArray& arr = doc.as<JsonArray>();
  18. REQUIRE(err == DeserializationError::Ok);
  19. REQUIRE(0 == arr.size());
  20. }
  21. SECTION("Before first value") {
  22. DeserializationError err = deserializeJson(doc, "[ \t\r\n42]");
  23. JsonArray& arr = doc.as<JsonArray>();
  24. REQUIRE(err == DeserializationError::Ok);
  25. REQUIRE(1 == arr.size());
  26. REQUIRE(arr[0] == 42);
  27. }
  28. SECTION("After first value") {
  29. DeserializationError err = deserializeJson(doc, "[42 \t\r\n]");
  30. JsonArray& arr = doc.as<JsonArray>();
  31. REQUIRE(err == DeserializationError::Ok);
  32. REQUIRE(1 == arr.size());
  33. REQUIRE(arr[0] == 42);
  34. }
  35. }
  36. SECTION("Values types") {
  37. SECTION("On integer") {
  38. DeserializationError err = deserializeJson(doc, "[42]");
  39. JsonArray& arr = doc.as<JsonArray>();
  40. REQUIRE(err == DeserializationError::Ok);
  41. REQUIRE(1 == arr.size());
  42. REQUIRE(arr[0] == 42);
  43. }
  44. SECTION("Two integers") {
  45. DeserializationError err = deserializeJson(doc, "[42,84]");
  46. JsonArray& arr = doc.as<JsonArray>();
  47. REQUIRE(err == DeserializationError::Ok);
  48. REQUIRE(2 == arr.size());
  49. REQUIRE(arr[0] == 42);
  50. REQUIRE(arr[1] == 84);
  51. }
  52. SECTION("Double") {
  53. DeserializationError err = deserializeJson(doc, "[4.2,1e2]");
  54. JsonArray& arr = doc.as<JsonArray>();
  55. REQUIRE(err == DeserializationError::Ok);
  56. REQUIRE(2 == arr.size());
  57. REQUIRE(arr[0] == 4.2);
  58. REQUIRE(arr[1] == 1e2);
  59. }
  60. SECTION("Unsigned long") {
  61. DeserializationError err = deserializeJson(doc, "[4294967295]");
  62. JsonArray& arr = doc.as<JsonArray>();
  63. REQUIRE(err == DeserializationError::Ok);
  64. REQUIRE(1 == arr.size());
  65. REQUIRE(arr[0] == 4294967295UL);
  66. }
  67. SECTION("Boolean") {
  68. DeserializationError err = deserializeJson(doc, "[true,false]");
  69. JsonArray& arr = doc.as<JsonArray>();
  70. REQUIRE(err == DeserializationError::Ok);
  71. REQUIRE(2 == arr.size());
  72. REQUIRE(arr[0] == true);
  73. REQUIRE(arr[1] == false);
  74. }
  75. SECTION("Null") {
  76. DeserializationError err = deserializeJson(doc, "[null,null]");
  77. JsonArray& arr = doc.as<JsonArray>();
  78. REQUIRE(err == DeserializationError::Ok);
  79. REQUIRE(2 == arr.size());
  80. REQUIRE(arr[0].as<char*>() == 0);
  81. REQUIRE(arr[1].as<char*>() == 0);
  82. }
  83. }
  84. SECTION("Quotes") {
  85. SECTION("Double quotes") {
  86. DeserializationError err =
  87. deserializeJson(doc, "[ \"hello\" , \"world\" ]");
  88. JsonArray& arr = doc.as<JsonArray>();
  89. REQUIRE(err == DeserializationError::Ok);
  90. REQUIRE(2 == arr.size());
  91. REQUIRE(arr[0] == "hello");
  92. REQUIRE(arr[1] == "world");
  93. }
  94. SECTION("Single quotes") {
  95. DeserializationError err = deserializeJson(doc, "[ 'hello' , 'world' ]");
  96. JsonArray& arr = doc.as<JsonArray>();
  97. REQUIRE(err == DeserializationError::Ok);
  98. REQUIRE(2 == arr.size());
  99. REQUIRE(arr[0] == "hello");
  100. REQUIRE(arr[1] == "world");
  101. }
  102. SECTION("No quotes") {
  103. DeserializationError err = deserializeJson(doc, "[ hello , world ]");
  104. JsonArray& arr = doc.as<JsonArray>();
  105. REQUIRE(err == DeserializationError::Ok);
  106. REQUIRE(2 == arr.size());
  107. REQUIRE(arr[0] == "hello");
  108. REQUIRE(arr[1] == "world");
  109. }
  110. SECTION("Double quotes (empty strings)") {
  111. DeserializationError err = deserializeJson(doc, "[\"\",\"\"]");
  112. JsonArray& arr = doc.as<JsonArray>();
  113. REQUIRE(err == DeserializationError::Ok);
  114. REQUIRE(2 == arr.size());
  115. REQUIRE(arr[0] == "");
  116. REQUIRE(arr[1] == "");
  117. }
  118. SECTION("Single quotes (empty strings)") {
  119. DeserializationError err = deserializeJson(doc, "[\'\',\'\']");
  120. JsonArray& arr = doc.as<JsonArray>();
  121. REQUIRE(err == DeserializationError::Ok);
  122. REQUIRE(2 == arr.size());
  123. REQUIRE(arr[0] == "");
  124. REQUIRE(arr[1] == "");
  125. }
  126. SECTION("No quotes (empty strings)") {
  127. DeserializationError err = deserializeJson(doc, "[,]");
  128. REQUIRE(err == DeserializationError::InvalidInput);
  129. }
  130. SECTION("Closing single quotes missing") {
  131. DeserializationError err = deserializeJson(doc, "[\"]");
  132. REQUIRE(err == DeserializationError::IncompleteInput);
  133. }
  134. SECTION("Closing double quotes missing") {
  135. DeserializationError err = deserializeJson(doc, "[\']");
  136. REQUIRE(err == DeserializationError::IncompleteInput);
  137. }
  138. }
  139. SECTION("Block comments") {
  140. SECTION("Before opening bracket") {
  141. DeserializationError err =
  142. deserializeJson(doc, "/*COMMENT*/ [\"hello\"]");
  143. JsonArray& arr = doc.as<JsonArray>();
  144. REQUIRE(err == DeserializationError::Ok);
  145. REQUIRE(1 == arr.size());
  146. REQUIRE(arr[0] == "hello");
  147. }
  148. SECTION("After opening bracket") {
  149. DeserializationError err =
  150. deserializeJson(doc, "[/*COMMENT*/ \"hello\"]");
  151. JsonArray& arr = doc.as<JsonArray>();
  152. REQUIRE(err == DeserializationError::Ok);
  153. REQUIRE(1 == arr.size());
  154. REQUIRE(arr[0] == "hello");
  155. }
  156. SECTION("Before closing bracket") {
  157. DeserializationError err = deserializeJson(doc, "[\"hello\"/*COMMENT*/]");
  158. JsonArray& arr = doc.as<JsonArray>();
  159. REQUIRE(err == DeserializationError::Ok);
  160. REQUIRE(1 == arr.size());
  161. REQUIRE(arr[0] == "hello");
  162. }
  163. SECTION("After closing bracket") {
  164. DeserializationError err = deserializeJson(doc, "[\"hello\"]/*COMMENT*/");
  165. JsonArray& arr = doc.as<JsonArray>();
  166. REQUIRE(err == DeserializationError::Ok);
  167. REQUIRE(1 == arr.size());
  168. REQUIRE(arr[0] == "hello");
  169. }
  170. SECTION("Before comma") {
  171. DeserializationError err =
  172. deserializeJson(doc, "[\"hello\"/*COMMENT*/,\"world\"]");
  173. JsonArray& arr = doc.as<JsonArray>();
  174. REQUIRE(err == DeserializationError::Ok);
  175. REQUIRE(2 == arr.size());
  176. REQUIRE(arr[0] == "hello");
  177. REQUIRE(arr[1] == "world");
  178. }
  179. SECTION("After comma") {
  180. DeserializationError err =
  181. deserializeJson(doc, "[\"hello\",/*COMMENT*/ \"world\"]");
  182. JsonArray& arr = doc.as<JsonArray>();
  183. REQUIRE(err == DeserializationError::Ok);
  184. REQUIRE(2 == arr.size());
  185. REQUIRE(arr[0] == "hello");
  186. REQUIRE(arr[1] == "world");
  187. }
  188. SECTION("/*/") {
  189. DeserializationError err = deserializeJson(doc, "[/*/\n]");
  190. REQUIRE(err == DeserializationError::IncompleteInput);
  191. }
  192. SECTION("Unfinished comment") {
  193. DeserializationError err = deserializeJson(doc, "[/*COMMENT]");
  194. REQUIRE(err == DeserializationError::IncompleteInput);
  195. }
  196. SECTION("Final slash missing") {
  197. DeserializationError err = deserializeJson(doc, "[/*COMMENT*]");
  198. REQUIRE(err == DeserializationError::IncompleteInput);
  199. }
  200. }
  201. SECTION("Trailing comments") {
  202. SECTION("Before opening bracket") {
  203. DeserializationError err =
  204. deserializeJson(doc, "//COMMENT\n\t[\"hello\"]");
  205. JsonArray& arr = doc.as<JsonArray>();
  206. REQUIRE(err == DeserializationError::Ok);
  207. REQUIRE(1 == arr.size());
  208. REQUIRE(arr[0] == "hello");
  209. }
  210. SECTION("After opening bracket") {
  211. DeserializationError err = deserializeJson(doc, "[//COMMENT\n\"hello\"]");
  212. JsonArray& arr = doc.as<JsonArray>();
  213. REQUIRE(err == DeserializationError::Ok);
  214. REQUIRE(1 == arr.size());
  215. REQUIRE(arr[0] == "hello");
  216. }
  217. SECTION("Before closing bracket") {
  218. DeserializationError err =
  219. deserializeJson(doc, "[\"hello\"//COMMENT\r\n]");
  220. JsonArray& arr = doc.as<JsonArray>();
  221. REQUIRE(err == DeserializationError::Ok);
  222. REQUIRE(1 == arr.size());
  223. REQUIRE(arr[0] == "hello");
  224. }
  225. SECTION("After closing bracket") {
  226. DeserializationError err = deserializeJson(doc, "[\"hello\"]//COMMENT\n");
  227. JsonArray& arr = doc.as<JsonArray>();
  228. REQUIRE(err == DeserializationError::Ok);
  229. REQUIRE(1 == arr.size());
  230. REQUIRE(arr[0] == "hello");
  231. }
  232. SECTION("Before comma") {
  233. DeserializationError err =
  234. deserializeJson(doc, "[\"hello\"//COMMENT\n,\"world\"]");
  235. JsonArray& arr = doc.as<JsonArray>();
  236. REQUIRE(err == DeserializationError::Ok);
  237. REQUIRE(2 == arr.size());
  238. REQUIRE(arr[0] == "hello");
  239. REQUIRE(arr[1] == "world");
  240. }
  241. SECTION("After comma") {
  242. DeserializationError err =
  243. deserializeJson(doc, "[\"hello\",//COMMENT\n\"world\"]");
  244. JsonArray& arr = doc.as<JsonArray>();
  245. REQUIRE(err == DeserializationError::Ok);
  246. REQUIRE(2 == arr.size());
  247. REQUIRE(arr[0] == "hello");
  248. REQUIRE(arr[1] == "world");
  249. }
  250. SECTION("Invalid comment") {
  251. DeserializationError err = deserializeJson(doc, "[/COMMENT\n]");
  252. REQUIRE(err == DeserializationError::InvalidInput);
  253. }
  254. SECTION("End document with comment") {
  255. DeserializationError err = deserializeJson(doc, "[//COMMENT");
  256. REQUIRE(err == DeserializationError::IncompleteInput);
  257. }
  258. }
  259. SECTION("Premature null-terminator") {
  260. SECTION("After opening bracket") {
  261. DeserializationError err = deserializeJson(doc, "[");
  262. REQUIRE(err == DeserializationError::IncompleteInput);
  263. }
  264. SECTION("After value") {
  265. DeserializationError err = deserializeJson(doc, "[1");
  266. REQUIRE(err == DeserializationError::IncompleteInput);
  267. }
  268. SECTION("After comma") {
  269. DeserializationError err = deserializeJson(doc, "[1,");
  270. REQUIRE(err == DeserializationError::IncompleteInput);
  271. }
  272. }
  273. SECTION("Premature end of input") {
  274. const char* input = "[1,2]";
  275. SECTION("After opening bracket") {
  276. DeserializationError err = deserializeJson(doc, input, 1);
  277. REQUIRE(err == DeserializationError::IncompleteInput);
  278. }
  279. SECTION("After value") {
  280. DeserializationError err = deserializeJson(doc, input, 2);
  281. REQUIRE(err == DeserializationError::IncompleteInput);
  282. }
  283. SECTION("After comma") {
  284. DeserializationError err = deserializeJson(doc, input, 3);
  285. REQUIRE(err == DeserializationError::IncompleteInput);
  286. }
  287. }
  288. SECTION("Misc") {
  289. SECTION("Nested objects") {
  290. char jsonString[] =
  291. " [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
  292. DeserializationError err = deserializeJson(doc, jsonString);
  293. JsonArray& arr = doc.as<JsonArray>();
  294. JsonObject& object1 = arr[0];
  295. const JsonObject& object2 = arr[1];
  296. JsonObject& object3 = arr[2];
  297. REQUIRE(err == DeserializationError::Ok);
  298. REQUIRE(true == object1.success());
  299. REQUIRE(true == object2.success());
  300. REQUIRE(false == object3.success());
  301. REQUIRE(2 == object1.size());
  302. REQUIRE(2 == object2.size());
  303. REQUIRE(0 == object3.size());
  304. REQUIRE(1 == object1["a"].as<int>());
  305. REQUIRE(2 == object1["b"].as<int>());
  306. REQUIRE(3 == object2["c"].as<int>());
  307. REQUIRE(4 == object2["d"].as<int>());
  308. REQUIRE(0 == object3["e"].as<int>());
  309. }
  310. }
  311. SECTION("Should clear the JsonArray") {
  312. deserializeJson(doc, "[1,2,3,4]");
  313. deserializeJson(doc, "[]");
  314. JsonArray& arr = doc.as<JsonArray>();
  315. REQUIRE(arr.size() == 0);
  316. REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
  317. }
  318. }