RyanJsonExample.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #include "RyanJson.h"
  2. #include "RyanJsonUtils.h"
  3. /**
  4. * @brief 生成json示例
  5. *
  6. * @return RyanJsonBool_e
  7. */
  8. static RyanJsonBool_e createJsonExample(void)
  9. {
  10. char *str = NULL;
  11. RyanJson_t jsonRoot, item;
  12. // 对象生成测试
  13. jsonRoot = RyanJsonCreateObject();
  14. RyanJsonAddIntToObject(jsonRoot, "inter", 16);
  15. RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
  16. RyanJsonAddStringToObject(jsonRoot, "string", "hello");
  17. RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
  18. RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
  19. RyanJsonAddNullToObject(jsonRoot, "null");
  20. // 添加子对象
  21. item = RyanJsonCreateObject();
  22. RyanJsonAddIntToObject(item, "inter", 16);
  23. RyanJsonAddDoubleToObject(item, "double", 16.89);
  24. RyanJsonAddStringToObject(item, "string", "hello");
  25. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  26. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  27. RyanJsonAddNullToObject(item, "null");
  28. RyanJsonAddItemToObject(jsonRoot, "item", item); // 将上面创建的item子对象添加到root父对象
  29. // 添加数字子数组
  30. int arrayInt[] = {16, 16, 16, 16, 16};
  31. RyanJsonAddItemToObject(jsonRoot, "arrayInt", RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  32. // 添加浮点数子数组
  33. double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
  34. RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
  35. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  36. // 添加字符串子数组
  37. const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
  38. RyanJsonAddItemToObject(jsonRoot, "arrayString",
  39. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  40. // 添加杂项数组
  41. RyanJson_t array = RyanJsonCreateArray();
  42. RyanJsonAddIntToArray(array, 16);
  43. RyanJsonAddDoubleToArray(array, 16.89);
  44. RyanJsonAddStringToArray(array, "hello");
  45. RyanJsonAddBoolToArray(array, RyanJsonTrue);
  46. RyanJsonAddBoolToArray(array, RyanJsonFalse);
  47. RyanJsonAddNullToArray(array);
  48. RyanJsonAddItemToObject(jsonRoot, "array", array); // 将上面创建的item子对象数组添加到root父对象
  49. // 添加对象数组
  50. RyanJson_t arrayItem = RyanJsonCreateArray();
  51. item = RyanJsonCreateObject();
  52. RyanJsonAddIntToObject(item, "inter", 16);
  53. RyanJsonAddDoubleToObject(item, "double", 16.89);
  54. RyanJsonAddStringToObject(item, "string", "hello");
  55. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  56. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  57. RyanJsonAddNullToObject(item, "null");
  58. RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
  59. item = RyanJsonCreateObject();
  60. RyanJsonAddIntToObject(item, "inter", 16);
  61. RyanJsonAddDoubleToObject(item, "double", 16.89);
  62. RyanJsonAddStringToObject(item, "string", "hello");
  63. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  64. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  65. RyanJsonAddNullToObject(item, "null");
  66. RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
  67. RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem); // 将arrayItem数组添加到root父对象
  68. uint32_t len = 0;
  69. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len); // 以带格式方式将数据打印出来
  70. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  71. RyanJsonFree(str);
  72. RyanJsonDelete(jsonRoot);
  73. return RyanJsonTrue;
  74. }
  75. /**
  76. * @brief 序列化json文本示例
  77. *
  78. * @return RyanJsonBool_e
  79. */
  80. static RyanJsonBool_e loadJsonExample(void)
  81. {
  82. char *str = NULL;
  83. RyanJson_t jsonRoot = NULL;
  84. const char *jsonstr = "{\"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. // 读取 int 数据
  100. int inter = RyanJsonGetIntValue(RyanJsonGetObjectByKey(jsonRoot, "inter"));
  101. if (inter != 16)
  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 (strcmp(str, jsonstr) != 0)
  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/baseTest 下的文件
  235. return RyanJsonTrue;
  236. }