RyanJsonExample.c 9.1 KB

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