RyanJsonTest.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144
  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 int rootNodeCheckTest(RyanJson_t json)
  17. {
  18. if (!RyanJsonIsInt(RyanJsonGetObjectToKey(json, "inter")) || 16 != RyanJsonGetIntValue(RyanJsonGetObjectToKey(json, "inter")))
  19. {
  20. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  21. return -1;
  22. }
  23. if (!RyanJsonIsDouble(RyanJsonGetObjectToKey(json, "double")) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")), 16.89))
  24. {
  25. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  26. return -1;
  27. }
  28. if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "string")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "string")), "hello"))
  29. {
  30. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  31. return -1;
  32. }
  33. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolTrue")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolTrue")) != RyanJsonTrue)
  34. {
  35. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  36. return -1;
  37. }
  38. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolFalse")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolFalse")) != RyanJsonFalse)
  39. {
  40. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  41. return -1;
  42. }
  43. if (!RyanJsonIsNull(RyanJsonGetObjectToKey(json, "null")))
  44. {
  45. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  46. return -1;
  47. }
  48. return 0;
  49. }
  50. int itemNodeCheckTest(RyanJson_t json)
  51. {
  52. RyanJson_t item = RyanJsonGetObjectToKey(json, "item");
  53. if (0 != rootNodeCheckTest(item))
  54. {
  55. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  56. return -1;
  57. }
  58. return 0;
  59. }
  60. int arrayNodeCheckTest(RyanJson_t json)
  61. {
  62. RyanJson_t item = NULL;
  63. // 判断是不是数组类型
  64. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayInt")))
  65. {
  66. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  67. return -1;
  68. }
  69. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayDouble")))
  70. {
  71. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  72. return -1;
  73. }
  74. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayString")))
  75. {
  76. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  77. return -1;
  78. }
  79. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "array")))
  80. {
  81. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  82. return -1;
  83. }
  84. /**
  85. * @brief 检查弱类型数组
  86. *
  87. */
  88. // array: [16, 16.89, "hello", true, false, null],
  89. if (!RyanJsonIsInt(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 0)) || 16 != RyanJsonGetIntValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 0)))
  90. {
  91. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  92. return -1;
  93. }
  94. if (!RyanJsonIsDouble(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)), 16.89))
  95. {
  96. printf("%s:%d 解析失败 %f\r\n", __FILE__, __LINE__, RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)));
  97. return -1;
  98. }
  99. if (!RyanJsonIsString(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 2)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 2)), "hello"))
  100. {
  101. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  102. return -1;
  103. }
  104. if (!RyanJsonIsBool(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 3)) || RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 3)) != RyanJsonTrue)
  105. {
  106. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  107. return -1;
  108. }
  109. if (!RyanJsonIsBool(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 4)) || RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 4)) != RyanJsonFalse)
  110. {
  111. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  112. return -1;
  113. }
  114. if (!RyanJsonIsNull(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 5)))
  115. {
  116. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  117. return -1;
  118. }
  119. /**
  120. * @brief 检查强类型数组
  121. *
  122. */
  123. for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayInt")); count++)
  124. {
  125. item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), count);
  126. if (!RyanJsonIsInt(item) || 16 != RyanJsonGetIntValue(item))
  127. {
  128. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  129. return -1;
  130. }
  131. }
  132. for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayDouble")); count++)
  133. {
  134. item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayDouble"), count);
  135. if (!RyanJsonIsDouble(item) || fabs(RyanJsonGetDoubleValue(item) - 16.8) < 0.001)
  136. {
  137. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  138. return -1;
  139. }
  140. }
  141. for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayString")); count++)
  142. {
  143. item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayString"), count);
  144. if (!RyanJsonIsString(item) || strcmp(RyanJsonGetStringValue(item), "hello"))
  145. {
  146. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  147. return -1;
  148. }
  149. }
  150. if (6 != RyanJsonGetSize(RyanJsonGetObjectToKey(json, "array")))
  151. {
  152. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  153. return -1;
  154. }
  155. return 0;
  156. }
  157. int arrayItemNodeCheckTest(RyanJson_t json)
  158. {
  159. if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayItem")))
  160. {
  161. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  162. return -1;
  163. }
  164. if (0 != rootNodeCheckTest(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)))
  165. {
  166. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  167. return -1;
  168. }
  169. if (0 != rootNodeCheckTest(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 1)))
  170. {
  171. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  172. return -1;
  173. }
  174. return 0;
  175. }
  176. /* --------------------------------------------------------------------- */
  177. int loadJsonTest()
  178. {
  179. char *str = NULL;
  180. RyanJson_t json;
  181. 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}]}";
  182. json = RyanJsonParse(jsonstr);
  183. if (json == NULL)
  184. {
  185. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  186. return -1;
  187. }
  188. str = RyanJsonPrint(json, 250, RyanJsonFalse, NULL);
  189. if (strcmp(str, jsonstr) != 0)
  190. {
  191. printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
  192. RyanJsonFree(str);
  193. RyanJsonDelete(json);
  194. return -1;
  195. }
  196. RyanJsonFree(str);
  197. if (0 != rootNodeCheckTest(json))
  198. {
  199. RyanJsonDelete(json);
  200. printf("%s:%d rootNodeCheckTest fail\r\n", __FILE__, __LINE__);
  201. return -1;
  202. }
  203. if (0 != itemNodeCheckTest(json))
  204. {
  205. RyanJsonDelete(json);
  206. printf("%s:%d itemNodeCheckTest fail\r\n", __FILE__, __LINE__);
  207. return -1;
  208. }
  209. if (0 != arrayNodeCheckTest(json))
  210. {
  211. RyanJsonDelete(json);
  212. printf("%s:%d arrayNodeCheckTest fail\r\n", __FILE__, __LINE__);
  213. return -1;
  214. }
  215. if (0 != arrayItemNodeCheckTest(json))
  216. {
  217. RyanJsonDelete(json);
  218. printf("%s:%d arrayItemNodeCheckTest fail\r\n", __FILE__, __LINE__);
  219. return -1;
  220. }
  221. RyanJsonDelete(json);
  222. /**
  223. * @brief 测试序列化错误json结构
  224. *
  225. */
  226. // \"inter\":16poi, 无效数字
  227. 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}]}");
  228. if (json != NULL)
  229. {
  230. RyanJsonDelete(json);
  231. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  232. return -1;
  233. }
  234. // \"double\":16.8yu9,, 无效浮点数
  235. 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}]}");
  236. if (json != NULL)
  237. {
  238. RyanJsonDelete(json);
  239. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  240. return -1;
  241. }
  242. // boolTrue 设置为 tru
  243. 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}]}");
  244. if (json != NULL)
  245. {
  246. RyanJsonDelete(json);
  247. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  248. return -1;
  249. }
  250. // boolFalse 设置为 fale
  251. 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}]}");
  252. if (json != NULL)
  253. {
  254. RyanJsonDelete(json);
  255. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  256. return -1;
  257. }
  258. // null 设置为 nul
  259. 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}]}");
  260. if (json != NULL)
  261. {
  262. RyanJsonDelete(json);
  263. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  264. return -1;
  265. }
  266. // null 设置为 NULL
  267. 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}]}");
  268. if (json != NULL)
  269. {
  270. RyanJsonDelete(json);
  271. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  272. return -1;
  273. }
  274. // \"inter\":16后面少个,
  275. 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}]}");
  276. if (json != NULL)
  277. {
  278. RyanJsonDelete(json);
  279. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  280. return -1;
  281. }
  282. // array数组项少一个,
  283. 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}]}");
  284. if (json != NULL)
  285. {
  286. RyanJsonDelete(json);
  287. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  288. return -1;
  289. }
  290. // \"item:{\"inter\":16,\" 少一个"
  291. 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}]}");
  292. if (json != NULL)
  293. {
  294. RyanJsonDelete(json);
  295. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  296. return -1;
  297. }
  298. // \"item\":{\"inter\":16,double\" 少一个"
  299. 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}]}");
  300. if (json != NULL)
  301. {
  302. RyanJsonDelete(json);
  303. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  304. return -1;
  305. }
  306. // \"item\":{\"inter\":16,\"\"double\" 多一个"
  307. 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}]}");
  308. if (json != NULL)
  309. {
  310. RyanJsonDelete(json);
  311. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  312. return -1;
  313. }
  314. // \"item\":{\"inter\":16\",\"double\" 多一个"
  315. 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}]}");
  316. if (json != NULL)
  317. {
  318. RyanJsonDelete(json);
  319. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  320. return -1;
  321. }
  322. // \"arrayInt\":[16,16,16m,16,16] 无效数组数字
  323. 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}]}");
  324. if (json != NULL)
  325. {
  326. RyanJsonDelete(json);
  327. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  328. return -1;
  329. }
  330. return 0;
  331. }
  332. int createJsonTest()
  333. {
  334. RyanJson_t jsonRoot, item;
  335. // 对象生成测试
  336. jsonRoot = RyanJsonCreateObject();
  337. RyanJsonAddIntToObject(jsonRoot, "inter", 16);
  338. RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
  339. RyanJsonAddStringToObject(jsonRoot, "string", "hello");
  340. RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
  341. RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
  342. RyanJsonAddNullToObject(jsonRoot, "null");
  343. /**
  344. * @brief 对象添加测试
  345. *
  346. */
  347. item = RyanJsonCreateObject();
  348. RyanJsonAddIntToObject(item, "inter", 16);
  349. RyanJsonAddDoubleToObject(item, "double", 16.89);
  350. RyanJsonAddStringToObject(item, "string", "hello");
  351. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  352. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  353. RyanJsonAddNullToObject(item, "null");
  354. RyanJsonAddItemToObject(jsonRoot, "item", item);
  355. /**
  356. * @brief 数组添加测试
  357. *
  358. */
  359. int arrayInt[] = {16, 16, 16, 16, 16};
  360. RyanJsonAddItemToObject(jsonRoot, "arrayInt",
  361. RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  362. double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
  363. RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
  364. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  365. const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
  366. RyanJsonAddItemToObject(jsonRoot, "arrayString",
  367. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  368. RyanJson_t array = RyanJsonCreateArray();
  369. RyanJsonAddIntToArray(array, 16);
  370. RyanJsonAddDoubleToArray(array, 16.89);
  371. RyanJsonAddStringToArray(array, "hello");
  372. RyanJsonAddBoolToArray(array, RyanJsonTrue);
  373. RyanJsonAddBoolToArray(array, RyanJsonFalse);
  374. RyanJsonAddNullToArray(array);
  375. RyanJsonAddItemToObject(jsonRoot, "array", array);
  376. /**
  377. * @brief 对象数组测试
  378. *
  379. */
  380. RyanJson_t arrayItem = RyanJsonCreateArray();
  381. item = RyanJsonCreateObject();
  382. RyanJsonAddIntToObject(item, "inter", 16);
  383. RyanJsonAddDoubleToObject(item, "double", 16.89);
  384. RyanJsonAddStringToObject(item, "string", "hello");
  385. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  386. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  387. RyanJsonAddNullToObject(item, "null");
  388. RyanJsonAddItemToObject(arrayItem, "item", item);
  389. item = RyanJsonCreateObject();
  390. RyanJsonAddIntToObject(item, "inter", 16);
  391. RyanJsonAddDoubleToObject(item, "double", 16.89);
  392. RyanJsonAddStringToObject(item, "string", "hello");
  393. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  394. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  395. RyanJsonAddNullToObject(item, "null");
  396. RyanJsonAddItemToObject(arrayItem, "item", item);
  397. RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem);
  398. if (0 != rootNodeCheckTest(jsonRoot))
  399. {
  400. RyanJsonDelete(jsonRoot);
  401. printf("%s:%d rootNodeCheckTest fail\r\n", __FILE__, __LINE__);
  402. return -1;
  403. }
  404. if (0 != itemNodeCheckTest(jsonRoot))
  405. {
  406. RyanJsonDelete(jsonRoot);
  407. printf("%s:%d itemNodeCheckTest fail\r\n", __FILE__, __LINE__);
  408. return -1;
  409. }
  410. if (0 != arrayNodeCheckTest(jsonRoot))
  411. {
  412. RyanJsonDelete(jsonRoot);
  413. printf("%s:%d arrayNodeCheckTest fail\r\n", __FILE__, __LINE__);
  414. return -1;
  415. }
  416. if (0 != arrayItemNodeCheckTest(jsonRoot))
  417. {
  418. RyanJsonDelete(jsonRoot);
  419. printf("%s:%d arrayItemNodeCheckTest fail\r\n", __FILE__, __LINE__);
  420. return -1;
  421. }
  422. RyanJsonDelete(jsonRoot);
  423. return 0;
  424. }
  425. int changeJsonTest()
  426. {
  427. 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}]}";
  428. RyanJson_t json = RyanJsonParse(jsonstr);
  429. if (json == NULL)
  430. {
  431. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  432. return -1;
  433. }
  434. /**
  435. * @brief 修改对应类型
  436. *
  437. */
  438. RyanJsonChangeIntValue(RyanJsonGetObjectToKey(json, "inter"), 20);
  439. if (!RyanJsonIsInt(RyanJsonGetObjectToKey(json, "inter")) || 20 != RyanJsonGetIntValue(RyanJsonGetObjectToKey(json, "inter")))
  440. {
  441. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  442. goto err;
  443. }
  444. RyanJsonChangeDoubleValue(RyanJsonGetObjectToKey(json, "double"), 20.89);
  445. if (!RyanJsonIsDouble(RyanJsonGetObjectToKey(json, "double")) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")), 20.89))
  446. {
  447. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  448. goto err;
  449. }
  450. RyanJsonChangeStringValue(RyanJsonGetObjectToKey(json, "string"), "world");
  451. if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "string")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "string")), "world"))
  452. {
  453. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  454. goto err;
  455. }
  456. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json, "boolTrue"), RyanJsonFalse);
  457. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolTrue")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolTrue")) != RyanJsonFalse)
  458. {
  459. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  460. goto err;
  461. }
  462. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json, "boolFalse"), RyanJsonTrue);
  463. if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolFalse")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolFalse")) != RyanJsonTrue)
  464. {
  465. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  466. goto err;
  467. }
  468. /* ---------------------------------- replace使用 -------------------------------------*/
  469. // 数组没有key, replace的子项不能有key, 函数内部没有做逻辑判断,会造成内存泄漏
  470. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0, RyanJsonCreateString(NULL, "arrayInt"));
  471. if (!RyanJsonIsString(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0)), "arrayInt"))
  472. {
  473. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  474. goto err;
  475. }
  476. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0, RyanJsonCreateString(NULL, "arrayItem"));
  477. if (!RyanJsonIsString(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)), "arrayItem"))
  478. {
  479. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  480. goto err;
  481. }
  482. // 对象必须包含key, 如果创建的对象key为null会引起内存错误
  483. RyanJsonReplaceByKey(json, "arrayString", RyanJsonCreateString("", "arrayString"));
  484. if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "arrayString")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "arrayString")), "arrayString"))
  485. {
  486. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  487. goto err;
  488. }
  489. // 修改数组节点为对象节点
  490. RyanJsonReplaceByKey(json, "arrayDouble", RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item")));
  491. if (!RyanJsonIsObject(RyanJsonGetObjectToKey(json, "arrayDouble")) || -1 == rootNodeCheckTest(RyanJsonGetObjectToKey(json, "arrayDouble")))
  492. {
  493. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  494. goto err;
  495. }
  496. /**
  497. * @brief 对象子项删除测试
  498. *
  499. */
  500. RyanJsonDeleteByIndex(json, 0);
  501. if (RyanJsonGetObjectToKey(json, "inter"))
  502. {
  503. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  504. goto err;
  505. }
  506. RyanJsonDeleteByKey(json, "double");
  507. if (RyanJsonGetObjectToKey(json, "double"))
  508. {
  509. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  510. goto err;
  511. }
  512. /**
  513. * @brief 数组对象子项删除测试
  514. *
  515. */
  516. RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json, "array"), 0);
  517. if (RyanJsonGetSize(RyanJsonGetObjectToKey(json, "array")) != 5)
  518. {
  519. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  520. goto err;
  521. }
  522. // str = RyanJsonPrint(json, 1024, RyanJsonTrue, NULL);
  523. // printf("aa %s\r\n", str);
  524. // RyanJsonFree(str);
  525. RyanJsonDelete(json);
  526. return 0;
  527. err:
  528. RyanJsonDelete(json);
  529. return -1;
  530. }
  531. int compareJsonTest()
  532. {
  533. 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}]}";
  534. // char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}";
  535. RyanJson_t json = RyanJsonParse(jsonstr);
  536. RyanJson_t json2 = RyanJsonParse(jsonstr);
  537. // 比较函数
  538. if (RyanJsonTrue != RyanJsonCompare(json, json2))
  539. {
  540. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  541. goto err;
  542. }
  543. RyanJsonDelete(json2);
  544. json2 = RyanJsonParse(jsonstr);
  545. RyanJsonAddStringToObject(json2, "test", "hello");
  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. RyanJsonAddIntToObject(json2, "test", 1);
  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. RyanJsonAddDoubleToObject(json2, "test", 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. RyanJsonAddBoolToObject(json2, "test", RyanJsonTrue);
  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. RyanJsonAddNullToObject(json2, "test");
  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. RyanJsonAddIntToArray(RyanJsonGetObjectToKey(json2, "arrayInt"), 2);
  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. RyanJsonAddDoubleToArray(RyanJsonGetObjectToKey(json2, "arrayDouble"), 2.0);
  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. RyanJsonAddStringToArray(RyanJsonGetObjectToKey(json2, "arrayString"), "hello");
  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. RyanJsonAddItemToArray(RyanJsonGetObjectToKey(json2, "arrayItem"), RyanJsonCreateString("test", "hello"));
  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. RyanJsonChangeKey(RyanJsonGetObjectToKey(json2, "inter"), "int2");
  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. RyanJsonChangeIntValue(RyanJsonGetObjectToKey(json2, "inter"), 17);
  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. RyanJsonChangeDoubleValue(RyanJsonGetObjectToKey(json2, "double"), 20.89);
  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. RyanJsonChangeStringValue(RyanJsonGetObjectToKey(json2, "string"), "49");
  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. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json2, "boolTrue"), RyanJsonFalse);
  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. RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json2, "item", "boolTrue"), RyanJsonFalse);
  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(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayInt"), 0), 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. RyanJsonChangeDoubleValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayDouble"), 0), 20.89);
  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. RyanJsonChangeStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayString"), 0), "20.89");
  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. RyanJsonChangeIntValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "array"), 0), 17);
  690. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  691. {
  692. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  693. goto err;
  694. }
  695. RyanJsonDelete(json2);
  696. json2 = RyanJsonParse(jsonstr);
  697. RyanJsonChangeIntValue(RyanJsonGetObjectToKey(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayItem"), 0), "inter"), 17);
  698. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  699. {
  700. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  701. goto err;
  702. }
  703. RyanJsonDelete(json2);
  704. json2 = RyanJsonParse(jsonstr);
  705. RyanJsonDeleteByKey(json2, "arrayItem");
  706. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  707. {
  708. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  709. goto err;
  710. }
  711. RyanJsonDelete(json2);
  712. json2 = RyanJsonParse(jsonstr);
  713. RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json2, "arrayInt"), 2);
  714. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  715. {
  716. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  717. goto err;
  718. }
  719. RyanJsonDelete(json2);
  720. json2 = RyanJsonParse(jsonstr);
  721. RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json2, "arrayItem"), 0);
  722. if (RyanJsonFalse != RyanJsonCompare(json, json2))
  723. {
  724. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  725. goto err;
  726. }
  727. RyanJsonDelete(json);
  728. RyanJsonDelete(json2);
  729. return 0;
  730. err:
  731. RyanJsonDelete(json);
  732. RyanJsonDelete(json2);
  733. return -1;
  734. }
  735. int duplicateTest()
  736. {
  737. RyanJson_t json, dupItem, jsonRoot = NULL;
  738. 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}]}";
  739. /**
  740. * @brief 普通类型
  741. *
  742. */
  743. json = RyanJsonParse(jsonstr);
  744. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  745. if (RyanJsonFalse == RyanJsonCompare(dupItem, RyanJsonGetObjectToKey(json, "inter")))
  746. {
  747. goto err;
  748. }
  749. RyanJsonDelete(dupItem);
  750. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  751. RyanJsonAddItemToObject(json, "test", dupItem);
  752. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test", "inter"), RyanJsonGetObjectToKey(json, "inter")))
  753. {
  754. goto err;
  755. }
  756. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  757. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  758. RyanJsonAddItemToObject(json, "test", dupItem);
  759. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test", "inter"), RyanJsonGetObjectToKey(json, "inter")))
  760. {
  761. goto err;
  762. }
  763. RyanJsonDelete(json);
  764. json = RyanJsonParse(jsonstr);
  765. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
  766. RyanJsonAddItemToObject(json, "test", dupItem);
  767. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test", "inter"), RyanJsonGetObjectToKey(json, "inter")))
  768. {
  769. goto err;
  770. }
  771. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  772. RyanJsonDelete(json);
  773. /**
  774. * @brief 对象类型
  775. *
  776. */
  777. json = RyanJsonParse(jsonstr);
  778. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  779. if (RyanJsonFalse == RyanJsonCompare(dupItem, RyanJsonGetObjectToKey(json, "item")))
  780. {
  781. goto err;
  782. }
  783. RyanJsonDelete(dupItem);
  784. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  785. RyanJsonAddItemToObject(json, "test", dupItem);
  786. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "item")))
  787. {
  788. goto err;
  789. }
  790. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  791. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  792. RyanJsonAddItemToObject(json, "test", dupItem);
  793. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "item")))
  794. {
  795. goto err;
  796. }
  797. RyanJsonDelete(json);
  798. json = RyanJsonParse(jsonstr);
  799. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  800. RyanJsonAddItemToObject(json, "test", dupItem);
  801. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "item")))
  802. {
  803. goto err;
  804. }
  805. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  806. RyanJsonDelete(json);
  807. /**
  808. * @brief 数组类型
  809. *
  810. */
  811. json = RyanJsonParse(jsonstr);
  812. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  813. if (RyanJsonFalse == RyanJsonCompare(dupItem, RyanJsonGetObjectToKey(json, "arrayItem")))
  814. {
  815. goto err;
  816. }
  817. RyanJsonDelete(dupItem);
  818. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  819. RyanJsonAddItemToObject(json, "test", dupItem);
  820. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "arrayItem")))
  821. {
  822. goto err;
  823. }
  824. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  825. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  826. RyanJsonAddItemToObject(json, "test", dupItem);
  827. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "arrayItem")))
  828. {
  829. goto err;
  830. }
  831. RyanJsonDelete(json);
  832. json = RyanJsonParse(jsonstr);
  833. dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
  834. RyanJsonAddItemToObject(json, "test", dupItem);
  835. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "arrayItem")))
  836. {
  837. goto err;
  838. }
  839. RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
  840. RyanJsonDelete(json);
  841. json = RyanJsonParse(jsonstr);
  842. jsonRoot = RyanJsonCreateObject();
  843. RyanJsonAddBoolToObject(jsonRoot, "arrayItem", RyanJsonTrue);
  844. int use = 0;
  845. for (uint8_t i = 0; i < 10; i++)
  846. {
  847. dupItem = RyanJsonParse(jsonstr);
  848. RyanJsonReplaceByKey(jsonRoot, "arrayItem", RyanJsonDuplicate(dupItem));
  849. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(jsonRoot, "arrayItem"), dupItem))
  850. {
  851. goto err;
  852. }
  853. RyanJsonReplaceByKey(json, "arrayItem", RyanJsonDuplicate(RyanJsonGetObjectByKey(dupItem, "item")));
  854. if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "arrayItem"), RyanJsonGetObjectByKey(dupItem, "item")))
  855. {
  856. goto err;
  857. }
  858. RyanJsonDelete(dupItem);
  859. int newuse = 0;
  860. v_mcheck(NULL, &newuse);
  861. if (i != 0 && newuse != use)
  862. {
  863. printf("%s:%d 内存泄漏\r\n", __FILE__, __LINE__);
  864. goto err;
  865. }
  866. use = newuse;
  867. }
  868. RyanJsonDelete(json);
  869. RyanJsonDelete(jsonRoot);
  870. return 0;
  871. err:
  872. RyanJsonDelete(json);
  873. RyanJsonDelete(jsonRoot);
  874. return -1;
  875. }
  876. int likeReferenceTest()
  877. {
  878. // char *str = NULL;
  879. // 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}]}";
  880. // RyanJson_t json = RyanJsonParse(jsonstr);
  881. // RyanJson_t item = NULL;
  882. // // RyanJson_t adfasdf = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  883. // // RyanJsonAddItemToObject(json, "test", adfasdf);
  884. // // 这里做你想做的事,这里我选择打印出来
  885. // // str = RyanJsonPrint(json, 50, RyanJsonTrue, NULL);
  886. // // printf("item %s \r\n", str);
  887. // // RyanJsonFree(str);
  888. // for (int i = 0; i < 1; i++)
  889. // {
  890. // // 分离test对象
  891. // item = RyanJsonDetachByKey(json, "item");
  892. // // if (RyanJsonIsKey(item))
  893. // // RyanJsonFree(RyanJsonGetKey(item));
  894. // // RyanJsonFree(item);
  895. // }
  896. // RyanJsonAddItemToObject(json, "item", item);
  897. // str = RyanJsonPrint(json, 50, RyanJsonTrue, NULL);
  898. // printf("item %s \r\n", str);
  899. // RyanJsonFree(str);
  900. // RyanJsonDelete(json);
  901. return 0;
  902. }
  903. int forEachTest()
  904. {
  905. char *str = NULL;
  906. 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}]}";
  907. RyanJson_t json = RyanJsonParse(jsonstr);
  908. RyanJson_t item = NULL;
  909. printf("arrayDouble: ");
  910. RyanJsonArrayForEach(RyanJsonGetObjectToKey(json, "arrayDouble"), item)
  911. {
  912. if (!RyanJsonIsDouble(item) || 16.89 != RyanJsonGetDoubleValue(item))
  913. {
  914. goto err;
  915. }
  916. }
  917. RyanJsonArrayForEach(RyanJsonGetObjectToKey(json, "arrayInt"), item)
  918. {
  919. if (!RyanJsonIsInt(item) || 16 != RyanJsonGetIntValue(item))
  920. {
  921. goto err;
  922. }
  923. }
  924. uint32_t strLen;
  925. RyanJsonObjectForEach(RyanJsonGetObjectToKey(json, "item"), item)
  926. {
  927. str = RyanJsonPrint(item, 50, RyanJsonTrue, &strLen);
  928. printf("item { %s : %s } %d\r\n", RyanJsonGetKey(item), str, strLen);
  929. RyanJsonFree(str);
  930. }
  931. RyanJsonDelete(json);
  932. return 0;
  933. err:
  934. RyanJsonDelete(json);
  935. return -1;
  936. }
  937. int RyanJsonTest(void)
  938. {
  939. int result = 0;
  940. RyanJsonInitHooks(v_malloc, v_free, v_realloc);
  941. result = loadJsonTest(); // 从文本解析json测试
  942. if (0 != result)
  943. {
  944. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  945. return -1;
  946. }
  947. result = createJsonTest(); // 生成json节点树测试
  948. if (0 != result)
  949. {
  950. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  951. return -1;
  952. }
  953. result = changeJsonTest(); // 修改json节点测试,包含删除、分离
  954. if (0 != result)
  955. {
  956. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  957. return -1;
  958. }
  959. result = compareJsonTest(); // 比较json节点树测试
  960. if (0 != result)
  961. {
  962. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  963. return -1;
  964. }
  965. result = duplicateTest(); // 复制测试
  966. if (0 != result)
  967. {
  968. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  969. return -1;
  970. }
  971. result = forEachTest();
  972. if (0 != result)
  973. {
  974. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  975. return -1;
  976. }
  977. result = likeReferenceTest(); // 模仿 引用类型实现 示例
  978. if (0 != result)
  979. {
  980. printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
  981. return -1;
  982. }
  983. displayMem();
  984. return 0;
  985. }