RyanJsonExample.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. #include "RyanJson.h"
  2. #include "RyanJsonUtils.h"
  3. #include "valloc.h"
  4. static inline RyanJsonBool_e RyanJsonCompareDouble(double a, double b)
  5. {
  6. double diff = fabs(a - b);
  7. double absA = fabs(a);
  8. double absB = fabs(b);
  9. double maxVal = (absA > absB ? absA : absB);
  10. // 允许的容差:相对误差 + 绝对误差
  11. double epsilon = DBL_EPSILON * maxVal;
  12. double minTolerance = 1e-12; // 可调的绝对容差
  13. return diff <= (epsilon > minTolerance ? epsilon : minTolerance);
  14. }
  15. /**
  16. * @brief 生成json示例
  17. *
  18. * @return RyanJsonBool_e
  19. */
  20. static RyanJsonBool_e createJsonExample(void)
  21. {
  22. char *str = NULL;
  23. RyanJson_t jsonRoot, item;
  24. // 对象生成测试
  25. jsonRoot = RyanJsonCreateObject();
  26. RyanJsonAddIntToObject(jsonRoot, "inter", 16);
  27. RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
  28. RyanJsonAddStringToObject(jsonRoot, "string", "hello");
  29. RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
  30. RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
  31. RyanJsonAddNullToObject(jsonRoot, "null");
  32. // 添加子对象
  33. item = RyanJsonCreateObject();
  34. RyanJsonAddIntToObject(item, "inter", 16);
  35. RyanJsonAddDoubleToObject(item, "double", 16.89);
  36. RyanJsonAddStringToObject(item, "string", "hello");
  37. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  38. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  39. RyanJsonAddNullToObject(item, "null");
  40. RyanJsonAddItemToObject(jsonRoot, "item", item); // 将上面创建的item子对象添加到root父对象
  41. // 添加数字子数组
  42. int arrayInt[] = {16, 16, 16, 16, 16};
  43. RyanJsonAddItemToObject(jsonRoot, "arrayInt", RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  44. // 添加浮点数子数组
  45. double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
  46. RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
  47. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  48. // 添加字符串子数组
  49. const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
  50. RyanJsonAddItemToObject(jsonRoot, "arrayString",
  51. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  52. // 添加杂项数组
  53. RyanJson_t array = RyanJsonCreateArray();
  54. RyanJsonAddIntToArray(array, 16);
  55. RyanJsonAddDoubleToArray(array, 16.89);
  56. RyanJsonAddStringToArray(array, "hello");
  57. RyanJsonAddBoolToArray(array, RyanJsonTrue);
  58. RyanJsonAddBoolToArray(array, RyanJsonFalse);
  59. RyanJsonAddNullToArray(array);
  60. RyanJsonAddItemToObject(jsonRoot, "array", array); // 将上面创建的item子对象数组添加到root父对象
  61. // 添加对象数组
  62. RyanJson_t arrayItem = RyanJsonCreateArray();
  63. item = RyanJsonCreateObject();
  64. RyanJsonAddIntToObject(item, "inter", 16);
  65. RyanJsonAddDoubleToObject(item, "double", 16.89);
  66. RyanJsonAddStringToObject(item, "string", "hello");
  67. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  68. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  69. RyanJsonAddNullToObject(item, "null");
  70. RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
  71. item = RyanJsonCreateObject();
  72. RyanJsonAddIntToObject(item, "inter", 16);
  73. RyanJsonAddDoubleToObject(item, "double", 16.89);
  74. RyanJsonAddStringToObject(item, "string", "hello");
  75. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  76. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  77. RyanJsonAddNullToObject(item, "null");
  78. RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
  79. RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem); // 将arrayItem数组添加到root父对象
  80. uint32_t len = 0;
  81. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len); // 以带格式方式将数据打印出来
  82. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  83. RyanJsonFree(str);
  84. RyanJsonDelete(jsonRoot);
  85. return RyanJsonTrue;
  86. }
  87. /**
  88. * @brief 序列化json文本示例
  89. *
  90. * @return RyanJsonBool_e
  91. */
  92. static RyanJsonBool_e loadJsonExample(void)
  93. {
  94. char *str = NULL;
  95. RyanJson_t jsonRoot;
  96. const char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,"
  97. "\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  98. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,"
  99. "16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\","
  100. "\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{"
  101. "\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  102. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  103. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  104. // 解析json数据
  105. jsonRoot = RyanJsonParse(jsonstr);
  106. if (jsonRoot == NULL)
  107. {
  108. printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
  109. return RyanJsonFalse;
  110. }
  111. // 读取 int 数据
  112. int inter = RyanJsonGetIntValue(RyanJsonGetObjectByKey(jsonRoot, "inter"));
  113. if (inter != 16)
  114. {
  115. printf("%s:%d 读取int失败\r\n", __FILE__, __LINE__);
  116. RyanJsonDelete(jsonRoot);
  117. return RyanJsonFalse;
  118. }
  119. // 读取 double 数据
  120. double doubleValue = RyanJsonGetDoubleValue(RyanJsonGetObjectByKey(jsonRoot, "double"));
  121. if (RyanJsonFalse == RyanJsonCompareDouble(doubleValue, 16.89))
  122. {
  123. printf("%s:%d 读取double失败\r\n", __FILE__, __LINE__);
  124. RyanJsonDelete(jsonRoot);
  125. return RyanJsonFalse;
  126. }
  127. // 读取 string 数据
  128. const char *strValue = RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "string"));
  129. if (0 != strcmp(strValue, "hello"))
  130. {
  131. printf("%s:%d 读取string失败\r\n", __FILE__, __LINE__);
  132. RyanJsonDelete(jsonRoot);
  133. return RyanJsonFalse;
  134. }
  135. // 读取 bool 数据
  136. RyanJsonBool_e boolValue = RyanJsonGetBoolValue(RyanJsonGetObjectByKey(jsonRoot, "boolTrue"));
  137. if (RyanJsonTrue != boolValue)
  138. {
  139. printf("%s:%d 读取bool失败\r\n", __FILE__, __LINE__);
  140. RyanJsonDelete(jsonRoot);
  141. return RyanJsonFalse;
  142. }
  143. // 读取 null 数据
  144. if (RyanJsonTrue != RyanJsonIsNull(RyanJsonGetObjectByKey(jsonRoot, "null")))
  145. {
  146. printf("%s:%d 读取null失败\r\n", __FILE__, __LINE__);
  147. RyanJsonDelete(jsonRoot);
  148. return RyanJsonFalse;
  149. }
  150. // 将序列化的数据以无格式样式打印出来,并和原始数据进行对比
  151. str = RyanJsonPrint(jsonRoot, 250, RyanJsonFalse, NULL);
  152. if (strcmp(str, jsonstr) != 0)
  153. {
  154. printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
  155. RyanJsonFree(str);
  156. RyanJsonDelete(jsonRoot);
  157. return RyanJsonFalse;
  158. }
  159. RyanJsonFree(str);
  160. // 将序列化的数据以有格式样式打印出来
  161. uint32_t len = 0;
  162. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
  163. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  164. RyanJsonFree(str);
  165. // 删除json对象
  166. RyanJsonDelete(jsonRoot);
  167. return RyanJsonTrue;
  168. }
  169. /**
  170. * @brief 修改json示例
  171. *
  172. * @return RyanJsonBool_e
  173. */
  174. static RyanJsonBool_e changeJsonExample(void)
  175. {
  176. char *str = NULL;
  177. RyanJson_t jsonRoot;
  178. const char *jsonstr = "{\"name\":\"Mash\",\"star\":4,\"doubleKey\":4.4,\"boolKey\":true,\"hits\":[2,2,1,3]}";
  179. // 解析json数据
  180. jsonRoot = RyanJsonParse(jsonstr);
  181. if (jsonRoot == NULL)
  182. {
  183. printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
  184. return RyanJsonFalse;
  185. }
  186. // 修改key
  187. RyanJsonChangeKey(RyanJsonGetObjectByKey(jsonRoot, "name"), "name2");
  188. if (0 != strcmp("name2", RyanJsonGetKey(RyanJsonGetObjectByKey(jsonRoot, "name2"))))
  189. {
  190. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  191. RyanJsonDelete(jsonRoot);
  192. return RyanJsonFalse;
  193. }
  194. // 修改strValue
  195. RyanJsonChangeStringValue(RyanJsonGetObjectByKey(jsonRoot, "name2"), "Ryan");
  196. if (0 != strcmp("Ryan", RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "name2"))))
  197. {
  198. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  199. RyanJsonDelete(jsonRoot);
  200. return RyanJsonFalse;
  201. }
  202. // 修改intValue
  203. RyanJsonChangeIntValue(RyanJsonGetObjectByKey(jsonRoot, "star"), 5);
  204. if (5 != RyanJsonGetIntValue(RyanJsonGetObjectByKey(jsonRoot, "star")))
  205. {
  206. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  207. RyanJsonDelete(jsonRoot);
  208. return RyanJsonFalse;
  209. }
  210. // 修改doubleValue
  211. RyanJsonChangeDoubleValue(RyanJsonGetObjectByKey(jsonRoot, "doubleKey"), 5.5);
  212. if (RyanJsonFalse == RyanJsonCompareDouble(RyanJsonGetDoubleValue(RyanJsonGetObjectByKey(jsonRoot, "doubleKey")), 5.5))
  213. {
  214. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  215. RyanJsonDelete(jsonRoot);
  216. return RyanJsonFalse;
  217. }
  218. // 修改boolValue
  219. RyanJsonChangeBoolValue(RyanJsonGetObjectByKey(jsonRoot, "boolKey"), RyanJsonFalse);
  220. if (RyanJsonFalse != RyanJsonGetBoolValue(RyanJsonGetObjectByKey(jsonRoot, "boolKey")))
  221. {
  222. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  223. RyanJsonDelete(jsonRoot);
  224. return RyanJsonFalse;
  225. }
  226. // 替换节点(修改节点类型)
  227. RyanJsonReplaceByKey(jsonRoot, "star", RyanJsonCreateString("", "123456"));
  228. // 将序列化的数据以有格式样式打印出来
  229. uint32_t len = 0;
  230. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
  231. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  232. RyanJsonFree(str);
  233. // 删除json对象
  234. RyanJsonDelete(jsonRoot);
  235. return RyanJsonTrue;
  236. }
  237. RyanJsonBool_e RyanJsonExample(void)
  238. {
  239. RyanJsonInitHooks(v_malloc, v_free, v_realloc);
  240. printf("\r\n--------------------------- RyanJson 生成示例 --------------------------\r\n");
  241. RyanJsonCheckReturnFalse(RyanJsonTrue == createJsonExample());
  242. printf("\r\n--------------------------- RyanJson 序列化json文本示例 --------------------------\r\n");
  243. RyanJsonCheckReturnFalse(RyanJsonTrue == loadJsonExample());
  244. printf("\r\n--------------------------- RyanJson 修改json示例 --------------------------\r\n");
  245. RyanJsonCheckReturnFalse(RyanJsonTrue == changeJsonExample());
  246. // 更多功能请查看 RyanJson.h 文件,不了解的可以查看 test/baseTest 下的文件
  247. return RyanJsonTrue;
  248. }