RyanJsonTest.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include "RyanJson.h"
  7. #include "cJSON.h"
  8. #include "valloc.h"
  9. /* --------------------------------------- jsonTest ------------------------------------------- */
  10. // !(fabs(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")) - 16.89) < 1e-6)
  11. static RyanJsonBool compare_double(double a, double b)
  12. {
  13. double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
  14. return (fabs(a - b) <= maxVal * DBL_EPSILON);
  15. }
  16. static uint64_t start;
  17. uint64_t getClock()
  18. {
  19. return clock();
  20. }
  21. static int rootNodeCheckTest(RyanJson_t json)
  22. {
  23. if (!RyanJsonIsInt(RyanJsonGetObjectToKey(json, "inter")) || 16 != RyanJsonGetIntValue(RyanJsonGetObjectToKey(json, "inter")))
  24. {
  25. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  26. return 0;
  27. }
  28. if (!RyanJsonIsDouble(RyanJsonGetObjectToKey(json, "double")) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")), 16.89))
  29. {
  30. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  31. return 0;
  32. }
  33. if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "string")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "string")), "hello"))
  34. {
  35. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  36. return 0;
  37. }
  38. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolTrue")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolTrue")) != RyanJsonTrue)
  39. {
  40. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  41. return 0;
  42. }
  43. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolFalse")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolFalse")) != RyanJsonFalse)
  44. {
  45. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  46. return 0;
  47. }
  48. if (!RyanJsonIsNull(RyanJsonGetObjectToKey(json, "null")))
  49. {
  50. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  51. return 0;
  52. }
  53. return 1;
  54. }
  55. int itemNodeCheckTest(RyanJson_t json)
  56. {
  57. RyanJson_t item = RyanJsonGetObjectToKey(json, "item");
  58. if (0 == rootNodeCheckTest(item))
  59. {
  60. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  61. return 0;
  62. }
  63. return 1;
  64. }
  65. int arrayNodeCheckTest(RyanJson_t json)
  66. {
  67. RyanJson_t item = NULL;
  68. // 判断是不是数组类型
  69. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayInt")))
  70. {
  71. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  72. return 0;
  73. }
  74. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayDouble")))
  75. {
  76. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  77. return 0;
  78. }
  79. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayString")))
  80. {
  81. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  82. return 0;
  83. }
  84. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "array")))
  85. {
  86. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  87. return 0;
  88. }
  89. /**
  90. * @brief 检查弱类型数组
  91. *
  92. */
  93. // array: [16, 16.89, "hello", true, false, null],
  94. if (!RyanJsonIsInt(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 0)) || 16 != RyanJsonGetIntValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 0)))
  95. {
  96. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  97. return 0;
  98. }
  99. if (!RyanJsonIsDouble(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)), 16.89))
  100. {
  101. printf("%s:%d 解析失败 %f\r\n", __FILE__, __LINE__, RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)));
  102. return 0;
  103. }
  104. if (!RyanJsonIsString(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 2)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 2)), "hello"))
  105. {
  106. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  107. return 0;
  108. }
  109. if (!RyanJsonIsBool(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 3)) || RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 3)) != RyanJsonTrue)
  110. {
  111. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  112. return 0;
  113. }
  114. if (!RyanJsonIsBool(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 4)) || RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 4)) != RyanJsonFalse)
  115. {
  116. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  117. return 0;
  118. }
  119. if (!RyanJsonIsNull(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 5)))
  120. {
  121. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  122. return 0;
  123. }
  124. /**
  125. * @brief 检查强类型数组
  126. *
  127. */
  128. for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayInt")); count++)
  129. {
  130. item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), count);
  131. if (!RyanJsonIsInt(item) || 16 != RyanJsonGetIntValue(item))
  132. {
  133. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  134. return 0;
  135. }
  136. }
  137. for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayDouble")); count++)
  138. {
  139. item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayDouble"), count);
  140. if (!RyanJsonIsDouble(item) || fabs(RyanJsonGetDoubleValue(item) - 16.8) < 0.001)
  141. {
  142. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  143. return 0;
  144. }
  145. }
  146. for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayString")); count++)
  147. {
  148. item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayString"), count);
  149. if (!RyanJsonIsString(item) || strcmp(RyanJsonGetStringValue(item), "hello"))
  150. {
  151. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  152. return 0;
  153. }
  154. }
  155. if (6 != RyanJsonGetSize(RyanJsonGetObjectToKey(json, "array")))
  156. {
  157. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  158. return 0;
  159. }
  160. return 1;
  161. }
  162. int arrayItemNodeCheckTest(RyanJson_t json)
  163. {
  164. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayItem")))
  165. {
  166. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  167. return 0;
  168. }
  169. if (0 == rootNodeCheckTest(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)))
  170. {
  171. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  172. return 0;
  173. }
  174. if (0 == rootNodeCheckTest(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 1)))
  175. {
  176. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  177. return 0;
  178. }
  179. return 1;
  180. }
  181. /* --------------------------------------------------------------------- */
  182. int loadJsonTest()
  183. {
  184. char *str = NULL;
  185. RyanJson_t json;
  186. char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  187. json = RyanJsonParse(jsonstr);
  188. if (json == NULL)
  189. {
  190. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  191. return 0;
  192. }
  193. str = RyanJsonPrint(json, 250, RyanJsonFalse, NULL);
  194. if (strcmp(str, jsonstr) != 0)
  195. {
  196. printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
  197. RyanJsonFree(str);
  198. RyanJsonDelete(json);
  199. return 0;
  200. }
  201. RyanJsonFree(str);
  202. rootNodeCheckTest(json);
  203. itemNodeCheckTest(json);
  204. arrayNodeCheckTest(json);
  205. arrayItemNodeCheckTest(json);
  206. RyanJsonDelete(json);
  207. // 测试序列化错误json结构
  208. // \"inter\":16poi, 无效数字
  209. json = RyanJsonParse("{\"inter\":16poi,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  210. if (json != NULL)
  211. {
  212. RyanJsonDelete(json);
  213. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  214. return 0;
  215. }
  216. // \"double\":16.8yu9,, 无效浮点数
  217. json = RyanJsonParse("{\"inter\":16,\"double\":16.8yu9,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  218. if (json != NULL)
  219. {
  220. RyanJsonDelete(json);
  221. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  222. return 0;
  223. }
  224. // boolTrue 设置为 tru
  225. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":tru,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  226. if (json != NULL)
  227. {
  228. RyanJsonDelete(json);
  229. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  230. return 0;
  231. }
  232. // null 设置为 nul
  233. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":nul,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  234. if (json != NULL)
  235. {
  236. RyanJsonDelete(json);
  237. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  238. return 0;
  239. }
  240. // null 设置为 NULL
  241. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":NULL,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  242. if (json != NULL)
  243. {
  244. RyanJsonDelete(json);
  245. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  246. return 0;
  247. }
  248. // \"inter\":16后面少个,
  249. json = RyanJsonParse("{\"inter\":16\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  250. if (json != NULL)
  251. {
  252. RyanJsonDelete(json);
  253. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  254. return 0;
  255. }
  256. // array数组项少一个,
  257. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  258. if (json != NULL)
  259. {
  260. RyanJsonDelete(json);
  261. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  262. return 0;
  263. }
  264. // boolFalse 设置为 fale
  265. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":fale,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  266. if (json != NULL)
  267. {
  268. RyanJsonDelete(json);
  269. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  270. return 0;
  271. }
  272. // \"item:{\"inter\":16,\" 少一个"
  273. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item:{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  274. if (json != NULL)
  275. {
  276. RyanJsonDelete(json);
  277. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  278. return 0;
  279. }
  280. // \"item\":{\"inter\":16,double\" 少一个"
  281. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  282. if (json != NULL)
  283. {
  284. RyanJsonDelete(json);
  285. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  286. return 0;
  287. }
  288. // \"item\":{\"inter\":16,\"\"double\" 多一个"
  289. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  290. if (json != NULL)
  291. {
  292. RyanJsonDelete(json);
  293. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  294. return 0;
  295. }
  296. // \"item\":{\"inter\":16\",\"double\" 多一个"
  297. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16\",\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  298. if (json != NULL)
  299. {
  300. RyanJsonDelete(json);
  301. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  302. return 0;
  303. }
  304. // \"arrayInt\":[16,16,16m,16,16] 无效数组数字
  305. json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16m,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
  306. if (json != NULL)
  307. {
  308. RyanJsonDelete(json);
  309. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  310. return 0;
  311. }
  312. return 1;
  313. }
  314. int createJsonTest()
  315. {
  316. char *str = NULL;
  317. RyanJson_t jsonRoot, item;
  318. // 对象生成测试
  319. jsonRoot = RyanJsonCreateObject();
  320. RyanJsonAddIntToObject(jsonRoot, "inter", 16);
  321. RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
  322. RyanJsonAddStringToObject(jsonRoot, "string", "hello");
  323. RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
  324. RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
  325. RyanJsonAddNullToObject(jsonRoot, "null");
  326. /**
  327. * @brief 对象添加测试
  328. *
  329. */
  330. item = RyanJsonCreateObject();
  331. RyanJsonAddIntToObject(item, "inter", 16);
  332. RyanJsonAddDoubleToObject(item, "double", 16.89);
  333. RyanJsonAddStringToObject(item, "string", "hello");
  334. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  335. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  336. RyanJsonAddNullToObject(item, "null");
  337. RyanJsonAddItemToObject(jsonRoot, "item", item);
  338. /**
  339. * @brief 数组添加测试
  340. *
  341. */
  342. int arrayInt[] = {16, 16, 16, 16, 16};
  343. RyanJsonAddItemToObject(jsonRoot, "arrayInt",
  344. RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  345. double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
  346. RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
  347. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  348. const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
  349. RyanJsonAddItemToObject(jsonRoot, "arrayString",
  350. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  351. RyanJson_t array = RyanJsonCreateArray();
  352. RyanJsonAddIntToArray(array, 16);
  353. RyanJsonAddDoubleToArray(array, 16.89);
  354. RyanJsonAddStringToArray(array, "hello");
  355. RyanJsonAddBoolToArray(array, RyanJsonTrue);
  356. RyanJsonAddBoolToArray(array, RyanJsonFalse);
  357. RyanJsonAddNullToArray(array);
  358. RyanJsonAddItemToObject(jsonRoot, "array", array);
  359. /**
  360. * @brief 对象数组测试
  361. *
  362. */
  363. RyanJson_t arrayItem = RyanJsonCreateArray();
  364. item = RyanJsonCreateObject();
  365. RyanJsonAddIntToObject(item, "inter", 16);
  366. RyanJsonAddDoubleToObject(item, "double", 16.89);
  367. RyanJsonAddStringToObject(item, "string", "hello");
  368. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  369. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  370. RyanJsonAddNullToObject(item, "null");
  371. RyanJsonAddItemToObject(arrayItem, "item", item);
  372. item = RyanJsonCreateObject();
  373. RyanJsonAddIntToObject(item, "inter", 16);
  374. RyanJsonAddDoubleToObject(item, "double", 16.89);
  375. RyanJsonAddStringToObject(item, "string", "hello");
  376. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  377. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  378. RyanJsonAddNullToObject(item, "null");
  379. RyanJsonAddItemToObject(arrayItem, "item", item);
  380. RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem);
  381. // str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, NULL);
  382. // printf("aa %s\r\n", str);
  383. // RyanJsonFree(str);
  384. rootNodeCheckTest(jsonRoot);
  385. itemNodeCheckTest(jsonRoot);
  386. arrayNodeCheckTest(jsonRoot);
  387. arrayItemNodeCheckTest(jsonRoot);
  388. RyanJsonDelete(jsonRoot);
  389. return 1;
  390. }
  391. int changeJsonTest()
  392. {
  393. char *str = NULL;
  394. char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  395. RyanJson_t json = RyanJsonParse(jsonstr);
  396. if (json == NULL)
  397. {
  398. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  399. return 0;
  400. }
  401. /**
  402. * @brief 修改对应类型
  403. *
  404. */
  405. RyanJsonChangeIntValue(RyanJsonGetObjectToKey(json, "inter"), 20);
  406. if (!RyanJsonIsInt(RyanJsonGetObjectToKey(json, "inter")) || 20 != RyanJsonGetIntValue(RyanJsonGetObjectToKey(json, "inter")))
  407. {
  408. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  409. goto err;
  410. }
  411. RyanJsonChangeDoubleValue(RyanJsonGetObjectToKey(json, "double"), 20.89);
  412. if (!RyanJsonIsDouble(RyanJsonGetObjectToKey(json, "double")) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")), 20.89))
  413. {
  414. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  415. goto err;
  416. }
  417. RyanJsonChangeStringValue(RyanJsonGetObjectToKey(json, "string"), "world");
  418. if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "string")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "string")), "world"))
  419. {
  420. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  421. goto err;
  422. }
  423. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json, "boolTrue"), RyanJsonFalse);
  424. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolTrue")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolTrue")) != RyanJsonFalse)
  425. {
  426. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  427. goto err;
  428. }
  429. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json, "boolFalse"), RyanJsonTrue);
  430. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolFalse")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolFalse")) != RyanJsonTrue)
  431. {
  432. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  433. goto err;
  434. }
  435. /* ---------------------------------- replace使用 -------------------------------------*/
  436. // 数组没有key, replace的子项不能有key, 函数内部没有做逻辑判断,会造成内存泄漏
  437. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0, RyanJsonCreateString(NULL, "arrayInt"));
  438. if (!RyanJsonIsString(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0)), "arrayInt"))
  439. {
  440. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  441. goto err;
  442. }
  443. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0, RyanJsonCreateString(NULL, "arrayItem"));
  444. if (!RyanJsonIsString(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)), "arrayItem"))
  445. {
  446. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  447. goto err;
  448. }
  449. // 对象必须包含key, 如果创建的对象key为null会引起内存错误
  450. RyanJsonReplaceByKey(json, "arrayString", RyanJsonCreateString("", "arrayString"));
  451. if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "arrayString")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "arrayString")), "arrayString"))
  452. {
  453. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  454. goto err;
  455. }
  456. // 修改数组节点为对象节点
  457. RyanJsonReplaceByKey(json, "arrayDouble", RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item")));
  458. if (!RyanJsonIsObject(RyanJsonGetObjectToKey(json, "arrayDouble")) || !rootNodeCheckTest(RyanJsonGetObjectToKey(json, "arrayDouble")))
  459. {
  460. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  461. goto err;
  462. }
  463. /**
  464. * @brief 对象子项删除测试
  465. *
  466. */
  467. RyanJsonDeleteByIndex(json, 0);
  468. if (RyanJsonGetObjectToKey(json, "inter"))
  469. {
  470. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  471. goto err;
  472. }
  473. RyanJsonDeleteByKey(json, "double");
  474. if (RyanJsonGetObjectToKey(json, "double"))
  475. {
  476. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  477. goto err;
  478. }
  479. /**
  480. * @brief 数组对象子项删除测试
  481. *
  482. */
  483. RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json, "array"), 0);
  484. if (RyanJsonGetSize(RyanJsonGetObjectToKey(json, "array")) != 5)
  485. {
  486. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  487. goto err;
  488. }
  489. // str = RyanJsonPrint(json, 1024, RyanJsonTrue, NULL);
  490. // printf("aa %s\r\n", str);
  491. // RyanJsonFree(str);
  492. RyanJsonDelete(json);
  493. return 1;
  494. err:
  495. RyanJsonDelete(json);
  496. return 0;
  497. }
  498. void compareJsonTest()
  499. {
  500. char *str = NULL;
  501. char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  502. // char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}";
  503. RyanJson_t json = RyanJsonParse(jsonstr);
  504. RyanJson_t json2 = RyanJsonParse(jsonstr);
  505. // 比较函数
  506. if (RyanJsonTrue != RyanJsonCompare(json, json2))
  507. {
  508. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  509. goto err;
  510. }
  511. RyanJsonDelete(json2);
  512. json2 = RyanJsonParse(jsonstr);
  513. RyanJsonAddStringToObject(json2, "test", "hello");
  514. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  515. {
  516. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  517. goto err;
  518. }
  519. RyanJsonDelete(json2);
  520. json2 = RyanJsonParse(jsonstr);
  521. RyanJsonAddIntToObject(json2, "test", 1);
  522. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  523. {
  524. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  525. goto err;
  526. }
  527. RyanJsonDelete(json2);
  528. json2 = RyanJsonParse(jsonstr);
  529. RyanJsonAddDoubleToObject(json2, "test", 2.0);
  530. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  531. {
  532. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  533. goto err;
  534. }
  535. RyanJsonDelete(json2);
  536. json2 = RyanJsonParse(jsonstr);
  537. RyanJsonAddBoolToObject(json2, "test", RyanJsonTrue);
  538. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  539. {
  540. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  541. goto err;
  542. }
  543. RyanJsonDelete(json2);
  544. json2 = RyanJsonParse(jsonstr);
  545. RyanJsonAddNullToObject(json2, "test");
  546. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  547. {
  548. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  549. goto err;
  550. }
  551. RyanJsonDelete(json2);
  552. json2 = RyanJsonParse(jsonstr);
  553. RyanJsonAddIntToArray(RyanJsonGetObjectToKey(json2, "arrayInt"), 2);
  554. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  555. {
  556. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  557. goto err;
  558. }
  559. RyanJsonDelete(json2);
  560. json2 = RyanJsonParse(jsonstr);
  561. RyanJsonAddDoubleToArray(RyanJsonGetObjectToKey(json2, "arrayDouble"), 2.0);
  562. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  563. {
  564. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  565. goto err;
  566. }
  567. RyanJsonDelete(json2);
  568. json2 = RyanJsonParse(jsonstr);
  569. RyanJsonAddStringToArray(RyanJsonGetObjectToKey(json2, "arrayString"), "hello");
  570. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  571. {
  572. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  573. goto err;
  574. }
  575. RyanJsonDelete(json2);
  576. json2 = RyanJsonParse(jsonstr);
  577. RyanJsonAddItemToArray(RyanJsonGetObjectToKey(json2, "arrayItem"), RyanJsonCreateString("test", "hello"));
  578. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  579. {
  580. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  581. goto err;
  582. }
  583. RyanJsonDelete(json2);
  584. json2 = RyanJsonParse(jsonstr);
  585. RyanJsonChangeKey(RyanJsonGetObjectToKey(json2, "inter"), "int2");
  586. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  587. {
  588. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  589. goto err;
  590. }
  591. RyanJsonDelete(json2);
  592. json2 = RyanJsonParse(jsonstr);
  593. RyanJsonChangeIntValue(RyanJsonGetObjectToKey(json2, "inter"), 17);
  594. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  595. {
  596. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  597. goto err;
  598. }
  599. RyanJsonDelete(json2);
  600. json2 = RyanJsonParse(jsonstr);
  601. RyanJsonChangeDoubleValue(RyanJsonGetObjectToKey(json2, "double"), 20.89);
  602. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  603. {
  604. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  605. goto err;
  606. }
  607. RyanJsonDelete(json2);
  608. json2 = RyanJsonParse(jsonstr);
  609. RyanJsonChangeStringValue(RyanJsonGetObjectToKey(json2, "string"), "49");
  610. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  611. {
  612. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  613. goto err;
  614. }
  615. RyanJsonDelete(json2);
  616. json2 = RyanJsonParse(jsonstr);
  617. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json2, "boolTrue"), RyanJsonFalse);
  618. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  619. {
  620. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  621. goto err;
  622. }
  623. RyanJsonDelete(json2);
  624. json2 = RyanJsonParse(jsonstr);
  625. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json2, "item", "boolTrue"), RyanJsonFalse);
  626. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  627. {
  628. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  629. goto err;
  630. }
  631. RyanJsonDelete(json2);
  632. json2 = RyanJsonParse(jsonstr);
  633. RyanJsonChangeIntValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayInt"), 0), 17);
  634. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  635. {
  636. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  637. goto err;
  638. }
  639. RyanJsonDelete(json2);
  640. json2 = RyanJsonParse(jsonstr);
  641. RyanJsonChangeDoubleValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayDouble"), 0), 20.89);
  642. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  643. {
  644. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  645. goto err;
  646. }
  647. RyanJsonDelete(json2);
  648. json2 = RyanJsonParse(jsonstr);
  649. RyanJsonChangeStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayString"), 0), "20.89");
  650. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  651. {
  652. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  653. goto err;
  654. }
  655. RyanJsonDelete(json2);
  656. json2 = RyanJsonParse(jsonstr);
  657. RyanJsonChangeIntValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "array"), 0), 17);
  658. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  659. {
  660. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  661. goto err;
  662. }
  663. RyanJsonDelete(json2);
  664. json2 = RyanJsonParse(jsonstr);
  665. RyanJsonChangeIntValue(RyanJsonGetObjectToKey(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayItem"), 0), "inter"), 17);
  666. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  667. {
  668. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  669. goto err;
  670. }
  671. RyanJsonDelete(json2);
  672. json2 = RyanJsonParse(jsonstr);
  673. RyanJsonDeleteByKey(json2, "arrayItem");
  674. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  675. {
  676. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  677. goto err;
  678. }
  679. RyanJsonDelete(json2);
  680. json2 = RyanJsonParse(jsonstr);
  681. RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json2, "arrayInt"), 2);
  682. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  683. {
  684. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  685. goto err;
  686. }
  687. RyanJsonDelete(json2);
  688. json2 = RyanJsonParse(jsonstr);
  689. RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json2, "arrayItem"), 0);
  690. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  691. {
  692. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  693. goto err;
  694. }
  695. err:
  696. RyanJsonDelete(json);
  697. RyanJsonDelete(json2);
  698. }
  699. void duplicateTest()
  700. {
  701. char *str = NULL;
  702. RyanJson_t json, item, dupItem;
  703. char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  704. // 内存泄漏测试
  705. /**
  706. * @brief 普通类型
  707. *
  708. */
  709. json = RyanJsonParse(jsonstr);
  710. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  711. RyanJsonDelete(dupItem);
  712. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  713. RyanJsonAddItemToObject(json, "test", dupItem);
  714. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  715. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  716. RyanJsonAddItemToObject(json, "test", dupItem);
  717. RyanJsonDelete(json);
  718. json = RyanJsonParse(jsonstr);
  719. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  720. RyanJsonAddItemToObject(json, "test", dupItem);
  721. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  722. RyanJsonDelete(json);
  723. /**
  724. * @brief 对象类型
  725. *
  726. */
  727. json = RyanJsonParse(jsonstr);
  728. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  729. RyanJsonDelete(dupItem);
  730. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  731. RyanJsonAddItemToObject(json, "test", dupItem);
  732. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  733. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  734. RyanJsonAddItemToObject(json, "test", dupItem);
  735. RyanJsonDelete(json);
  736. json = RyanJsonParse(jsonstr);
  737. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  738. RyanJsonAddItemToObject(json, "test", dupItem);
  739. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  740. RyanJsonDelete(json);
  741. /**
  742. * @brief 数组类型
  743. *
  744. */
  745. json = RyanJsonParse(jsonstr);
  746. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  747. RyanJsonDelete(dupItem);
  748. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  749. RyanJsonAddItemToObject(json, "test", dupItem);
  750. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  751. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  752. RyanJsonAddItemToObject(json, "test", dupItem);
  753. RyanJsonDelete(json);
  754. json = RyanJsonParse(jsonstr);
  755. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  756. RyanJsonAddItemToObject(json, "test", dupItem);
  757. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  758. RyanJsonDelete(json);
  759. json = RyanJsonParse(jsonstr);
  760. RyanJson_t jsonRoot = RyanJsonCreateObject();
  761. RyanJsonAddBoolToObject(jsonRoot, "arrayItem", RyanJsonTrue);
  762. int use = 0;
  763. for (uint8_t i = 0; i < 10; i++)
  764. {
  765. dupItem = RyanJsonParse(jsonstr);
  766. RyanJsonReplaceByKey(jsonRoot, "arrayItem", RyanJsonDuplicate(dupItem));
  767. RyanJsonReplaceByKey(json, "arrayItem", RyanJsonDuplicate(RyanJsonGetObjectByKey(dupItem, "item")));
  768. RyanJsonDelete(dupItem);
  769. int newuse = 0;
  770. v_mcheck(NULL, &newuse);
  771. if (i != 0 && newuse != use)
  772. {
  773. printf("%s:%d 内存泄漏\r\n", __FILE__, __LINE__);
  774. break;
  775. }
  776. use = newuse;
  777. // displayMem();
  778. // _sleep(1000)
  779. }
  780. RyanJsonDelete(json);
  781. RyanJsonDelete(jsonRoot);
  782. }
  783. void likeReferenceTest()
  784. {
  785. // char *str = NULL;
  786. // char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  787. // RyanJson_t json = RyanJsonParse(jsonstr);
  788. // RyanJson_t item = NULL;
  789. // // RyanJson_t adfasdf = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  790. // // RyanJsonAddItemToObject(json, "test", adfasdf);
  791. // // 这里做你想做的事,这里我选择打印出来
  792. // // str = RyanJsonPrint(json, 50, RyanJsonTrue, NULL);
  793. // // printf("item %s \r\n", str);
  794. // // RyanJsonFree(str);
  795. // for (int i = 0; i < 1; i++)
  796. // {
  797. // // 分离test对象
  798. // item = RyanJsonDetachByKey(json, "item");
  799. // // if (RyanJsonIsKey(item))
  800. // // RyanJsonFree(RyanJsonGetKey(item));
  801. // // RyanJsonFree(item);
  802. // }
  803. // RyanJsonAddItemToObject(json, "item", item);
  804. // str = RyanJsonPrint(json, 50, RyanJsonTrue, NULL);
  805. // printf("item %s \r\n", str);
  806. // RyanJsonFree(str);
  807. // RyanJsonDelete(json);
  808. }
  809. void forEachTest()
  810. {
  811. char *str = NULL;
  812. char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  813. RyanJson_t json = RyanJsonParse(jsonstr);
  814. RyanJson_t item = NULL;
  815. printf("arrayDouble: ");
  816. RyanJsonArrayForEach(RyanJsonGetObjectToKey(json, "arrayDouble"), item)
  817. {
  818. printf("%lf ", RyanJsonGetDoubleValue(item));
  819. }
  820. printf("\r\n");
  821. int strLen;
  822. RyanJsonObjectForEach(RyanJsonGetObjectToKey(json, "item"), item)
  823. {
  824. str = RyanJsonPrint(item, 50, RyanJsonTrue, &strLen);
  825. printf("item { %s : %s } %d\r\n", RyanJsonGetKey(item), str, strLen);
  826. RyanJsonFree(str);
  827. }
  828. RyanJsonDelete(json);
  829. }
  830. int RyanJsonTest(void)
  831. {
  832. RyanJsonInitHooks(v_malloc, v_free, v_realloc);
  833. loadJsonTest(); // 从文本解析json测试
  834. createJsonTest(); // 生成json节点树测试
  835. changeJsonTest(); // 修改json节点测试,包含删除、分离
  836. compareJsonTest(); // 比较json节点树测试
  837. duplicateTest(); // 复制测试
  838. forEachTest();
  839. likeReferenceTest(); // 模仿 引用类型实现 示例
  840. displayMem();
  841. return 0;
  842. }