RyanJsonExample.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "RyanJson.h"
  2. // 示例入口会被单测 runner 直接调用,这里补前置声明以满足严格编译告警。
  3. RyanJsonBool_e RyanJsonExample(void);
  4. /**
  5. * @brief Json 构建示例
  6. *
  7. * @return RyanJsonBool_e
  8. */
  9. static RyanJsonBool_e createJsonExample(void)
  10. {
  11. char *str = NULL;
  12. RyanJson_t jsonRoot, item;
  13. // 构建根 Object
  14. jsonRoot = RyanJsonCreateObject();
  15. RyanJsonAddIntToObject(jsonRoot, "inter", 16);
  16. RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
  17. RyanJsonAddStringToObject(jsonRoot, "string", "hello");
  18. RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
  19. RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
  20. RyanJsonAddNullToObject(jsonRoot, "null");
  21. // 添加子 Object
  22. item = RyanJsonCreateObject();
  23. RyanJsonAddIntToObject(item, "inter", 16);
  24. RyanJsonAddDoubleToObject(item, "double", 16.89);
  25. RyanJsonAddStringToObject(item, "string", "hello");
  26. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  27. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  28. RyanJsonAddNullToObject(item, "null");
  29. RyanJsonAddItemToObject(jsonRoot, "item", item); // 把子 Object 挂到根 Object
  30. // 添加 Int 子 Array
  31. int32_t arrayInt[] = {16, 16, 16, 16, 16};
  32. RyanJsonAddItemToObject(jsonRoot, "arrayInt", RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  33. // 添加 Double 子 Array
  34. double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
  35. RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
  36. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  37. // 添加 String 子 Array
  38. const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
  39. RyanJsonAddItemToObject(jsonRoot, "arrayString",
  40. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  41. // 添加杂项 Array
  42. RyanJson_t array = RyanJsonCreateArray();
  43. RyanJsonAddIntToArray(array, 16);
  44. RyanJsonAddDoubleToArray(array, 16.89);
  45. RyanJsonAddStringToArray(array, "hello");
  46. RyanJsonAddBoolToArray(array, RyanJsonTrue);
  47. RyanJsonAddBoolToArray(array, RyanJsonFalse);
  48. RyanJsonAddNullToArray(array);
  49. RyanJsonAddItemToObject(jsonRoot, "array", array); // 把混合 Array 挂到根 Object
  50. // 添加 Object Array
  51. RyanJson_t arrayItem = RyanJsonCreateArray();
  52. item = RyanJsonCreateObject();
  53. RyanJsonAddIntToObject(item, "inter", 16);
  54. RyanJsonAddDoubleToObject(item, "double", 16.89);
  55. RyanJsonAddStringToObject(item, "string", "hello");
  56. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  57. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  58. RyanJsonAddNullToObject(item, "null");
  59. RyanJsonAddItemToObject(arrayItem, "item", item); // 将 Object 加入 Array
  60. item = RyanJsonCreateObject();
  61. RyanJsonAddIntToObject(item, "inter", 16);
  62. RyanJsonAddDoubleToObject(item, "double", 16.89);
  63. RyanJsonAddStringToObject(item, "string", "hello");
  64. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  65. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  66. RyanJsonAddNullToObject(item, "null");
  67. RyanJsonAddItemToObject(arrayItem, "item", item); // 将 Object 加入 Array
  68. RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem); // 把 Object Array 挂到根 Object
  69. uint32_t len = 0;
  70. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len); // 格式化打印
  71. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  72. RyanJsonFree(str);
  73. RyanJsonDelete(jsonRoot);
  74. return RyanJsonTrue;
  75. }
  76. /**
  77. * @brief Json 解析示例
  78. *
  79. * @return RyanJsonBool_e
  80. */
  81. static RyanJsonBool_e loadJsonExample(void)
  82. {
  83. char *str = NULL;
  84. RyanJson_t jsonRoot = NULL;
  85. static const char *jsonstr =
  86. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,"
  87. "\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  88. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,"
  89. "16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\","
  90. "\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{"
  91. "\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  92. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  93. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  94. // 解析 Json 文本
  95. jsonRoot = RyanJsonParse(jsonstr);
  96. if (NULL == jsonRoot)
  97. {
  98. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  99. return RyanJsonFalse;
  100. }
  101. // 读取 Int 数据
  102. int32_t inter = RyanJsonGetIntValue(RyanJsonGetObjectByKey(jsonRoot, "inter"));
  103. if (16 != inter)
  104. {
  105. printf("%s:%d 读取int失败\r\n", __FILE__, __LINE__);
  106. RyanJsonDelete(jsonRoot);
  107. return RyanJsonFalse;
  108. }
  109. // 读取 Double 数据
  110. double doubleValue = RyanJsonGetDoubleValue(RyanJsonGetObjectByKey(jsonRoot, "double"));
  111. if (RyanJsonFalse == RyanJsonCompareDouble(doubleValue, 16.89))
  112. {
  113. printf("%s:%d 读取double失败\r\n", __FILE__, __LINE__);
  114. RyanJsonDelete(jsonRoot);
  115. return RyanJsonFalse;
  116. }
  117. // 读取 String 数据
  118. const char *strValue = RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "string"));
  119. if (0 != strcmp(strValue, "hello"))
  120. {
  121. printf("%s:%d 读取string失败\r\n", __FILE__, __LINE__);
  122. RyanJsonDelete(jsonRoot);
  123. return RyanJsonFalse;
  124. }
  125. // 读取 Bool 数据
  126. RyanJsonBool_e boolValue = RyanJsonGetBoolValue(RyanJsonGetObjectByKey(jsonRoot, "boolTrue"));
  127. if (RyanJsonTrue != boolValue)
  128. {
  129. printf("%s:%d 读取bool失败\r\n", __FILE__, __LINE__);
  130. RyanJsonDelete(jsonRoot);
  131. return RyanJsonFalse;
  132. }
  133. // 读取 Null 数据
  134. if (RyanJsonTrue != RyanJsonIsNull(RyanJsonGetObjectByKey(jsonRoot, "null")))
  135. {
  136. printf("%s:%d 读取null失败\r\n", __FILE__, __LINE__);
  137. RyanJsonDelete(jsonRoot);
  138. return RyanJsonFalse;
  139. }
  140. // 将解析结果以无格式重新输出,并与原始文本对比
  141. str = RyanJsonPrint(jsonRoot, 250, RyanJsonFalse, NULL);
  142. if (0 != strcmp(str, jsonstr))
  143. {
  144. printf("%s:%d 解析后再序列化结果不一致 %s\r\n", __FILE__, __LINE__, str);
  145. RyanJsonFree(str);
  146. RyanJsonDelete(jsonRoot);
  147. return RyanJsonFalse;
  148. }
  149. RyanJsonFree(str);
  150. // 将解析结果以格式化样式打印
  151. uint32_t len = 0;
  152. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
  153. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  154. RyanJsonFree(str);
  155. // 释放 Json Object
  156. RyanJsonDelete(jsonRoot);
  157. return RyanJsonTrue;
  158. }
  159. /**
  160. * @brief Json 修改示例
  161. *
  162. * @return RyanJsonBool_e
  163. */
  164. static RyanJsonBool_e changeJsonExample(void)
  165. {
  166. char *str = NULL;
  167. RyanJson_t jsonRoot;
  168. const char *jsonstr = "{\"name\":\"Mash\",\"star\":4,\"doubleKey\":4.4,\"boolKey\":true,\"hits\":[2,2,1,3]}";
  169. // 解析 Json 文本
  170. jsonRoot = RyanJsonParse(jsonstr);
  171. if (jsonRoot == NULL)
  172. {
  173. printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
  174. return RyanJsonFalse;
  175. }
  176. // 修改 key
  177. RyanJsonChangeKey(RyanJsonGetObjectByKey(jsonRoot, "name"), "name2");
  178. if (0 != strcmp("name2", RyanJsonGetKey(RyanJsonGetObjectByKey(jsonRoot, "name2"))))
  179. {
  180. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  181. RyanJsonDelete(jsonRoot);
  182. return RyanJsonFalse;
  183. }
  184. // 修改 strValue
  185. RyanJsonChangeStringValue(RyanJsonGetObjectByKey(jsonRoot, "name2"), "Ryan");
  186. if (0 != strcmp("Ryan", RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "name2"))))
  187. {
  188. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  189. RyanJsonDelete(jsonRoot);
  190. return RyanJsonFalse;
  191. }
  192. // 修改 intValue
  193. RyanJsonChangeIntValue(RyanJsonGetObjectByKey(jsonRoot, "star"), 5);
  194. if (5 != RyanJsonGetIntValue(RyanJsonGetObjectByKey(jsonRoot, "star")))
  195. {
  196. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  197. RyanJsonDelete(jsonRoot);
  198. return RyanJsonFalse;
  199. }
  200. // 修改 doubleValue
  201. RyanJsonChangeDoubleValue(RyanJsonGetObjectByKey(jsonRoot, "doubleKey"), 5.5);
  202. if (RyanJsonFalse == RyanJsonCompareDouble(RyanJsonGetDoubleValue(RyanJsonGetObjectByKey(jsonRoot, "doubleKey")), 5.5))
  203. {
  204. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  205. RyanJsonDelete(jsonRoot);
  206. return RyanJsonFalse;
  207. }
  208. // 修改 boolValue
  209. RyanJsonChangeBoolValue(RyanJsonGetObjectByKey(jsonRoot, "boolKey"), RyanJsonFalse);
  210. if (RyanJsonFalse != RyanJsonGetBoolValue(RyanJsonGetObjectByKey(jsonRoot, "boolKey")))
  211. {
  212. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  213. RyanJsonDelete(jsonRoot);
  214. return RyanJsonFalse;
  215. }
  216. // 替换节点(同时改变节点类型)
  217. RyanJsonReplaceByKey(jsonRoot, "star", RyanJsonCreateString("", "123456"));
  218. // 将修改结果以格式化样式打印
  219. uint32_t len = 0;
  220. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
  221. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  222. RyanJsonFree(str);
  223. // 释放 Json Object
  224. RyanJsonDelete(jsonRoot);
  225. return RyanJsonTrue;
  226. }
  227. RyanJsonBool_e RyanJsonExample(void)
  228. {
  229. RyanJsonInitHooks(malloc, free, NULL);
  230. printf("\r\n--------------------------- RyanJson 生成示例 --------------------------\r\n");
  231. RyanJsonCheckReturnFalse(RyanJsonTrue == createJsonExample());
  232. printf("\r\n--------------------------- RyanJson 解析json文本示例 --------------------------\r\n");
  233. RyanJsonCheckReturnFalse(RyanJsonTrue == loadJsonExample());
  234. printf("\r\n--------------------------- RyanJson 修改json示例 --------------------------\r\n");
  235. RyanJsonCheckReturnFalse(RyanJsonTrue == changeJsonExample());
  236. // 更多功能请查看 RyanJson.h 与 test 目录下的测试用例
  237. return RyanJsonTrue;
  238. }