RyanJsonExample.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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 "RyanJsonUtils.h"
  8. #include "valloc.h"
  9. /**
  10. * @brief 生成json示例
  11. *
  12. * @return int
  13. */
  14. static int createJsonExample(void)
  15. {
  16. char *str = NULL;
  17. RyanJson_t jsonRoot, item;
  18. // 对象生成测试
  19. jsonRoot = RyanJsonCreateObject();
  20. RyanJsonAddIntToObject(jsonRoot, "inter", 16);
  21. RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
  22. RyanJsonAddStringToObject(jsonRoot, "string", "hello");
  23. RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
  24. RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
  25. RyanJsonAddNullToObject(jsonRoot, "null");
  26. // 添加子对象
  27. item = RyanJsonCreateObject();
  28. RyanJsonAddIntToObject(item, "inter", 16);
  29. RyanJsonAddDoubleToObject(item, "double", 16.89);
  30. RyanJsonAddStringToObject(item, "string", "hello");
  31. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  32. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  33. RyanJsonAddNullToObject(item, "null");
  34. RyanJsonAddItemToObject(jsonRoot, "item", item); // 将上面创建的item子对象添加到root父对象
  35. // 添加数字子数组
  36. int arrayInt[] = {16, 16, 16, 16, 16};
  37. RyanJsonAddItemToObject(jsonRoot, "arrayInt", RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  38. // 添加浮点数子数组
  39. double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
  40. RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
  41. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  42. // 添加字符串子数组
  43. const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
  44. RyanJsonAddItemToObject(jsonRoot, "arrayString",
  45. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  46. // 添加杂项数组
  47. RyanJson_t array = RyanJsonCreateArray();
  48. RyanJsonAddIntToArray(array, 16);
  49. RyanJsonAddDoubleToArray(array, 16.89);
  50. RyanJsonAddStringToArray(array, "hello");
  51. RyanJsonAddBoolToArray(array, RyanJsonTrue);
  52. RyanJsonAddBoolToArray(array, RyanJsonFalse);
  53. RyanJsonAddNullToArray(array);
  54. RyanJsonAddItemToObject(jsonRoot, "array", array); // 将上面创建的item子对象数组添加到root父对象
  55. // 添加对象数组
  56. RyanJson_t arrayItem = RyanJsonCreateArray();
  57. item = RyanJsonCreateObject();
  58. RyanJsonAddIntToObject(item, "inter", 16);
  59. RyanJsonAddDoubleToObject(item, "double", 16.89);
  60. RyanJsonAddStringToObject(item, "string", "hello");
  61. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  62. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  63. RyanJsonAddNullToObject(item, "null");
  64. RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
  65. item = RyanJsonCreateObject();
  66. RyanJsonAddIntToObject(item, "inter", 16);
  67. RyanJsonAddDoubleToObject(item, "double", 16.89);
  68. RyanJsonAddStringToObject(item, "string", "hello");
  69. RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
  70. RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
  71. RyanJsonAddNullToObject(item, "null");
  72. RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
  73. RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem); // 将arrayItem数组添加到root父对象
  74. uint32_t len = 0;
  75. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len); // 以带格式方式将数据打印出来
  76. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  77. RyanJsonFree(str);
  78. RyanJsonDelete(jsonRoot);
  79. return 0;
  80. }
  81. /**
  82. * @brief 序列化json文本示例
  83. *
  84. * @return int
  85. */
  86. static int loadJsonExample(void)
  87. {
  88. char *str = NULL;
  89. RyanJson_t jsonRoot;
  90. const char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,"
  91. "\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  92. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,"
  93. "16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\","
  94. "\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{"
  95. "\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  96. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
  97. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
  98. // 解析json数据
  99. jsonRoot = RyanJsonParse(jsonstr);
  100. if (jsonRoot == NULL)
  101. {
  102. printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
  103. return -1;
  104. }
  105. // 将序列化的数据以无格式样式打印出来,并和原始数据进行对比
  106. str = RyanJsonPrint(jsonRoot, 250, RyanJsonFalse, NULL);
  107. if (strcmp(str, jsonstr) != 0)
  108. {
  109. printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
  110. RyanJsonFree(str);
  111. RyanJsonDelete(jsonRoot);
  112. return -1;
  113. }
  114. RyanJsonFree(str);
  115. // 将序列化的数据以有格式样式打印出来
  116. uint32_t len = 0;
  117. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
  118. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  119. RyanJsonFree(str);
  120. // 删除json对象
  121. RyanJsonDelete(jsonRoot);
  122. return 0;
  123. }
  124. /**
  125. * @brief 修改json示例
  126. *
  127. * @return int
  128. */
  129. static int changeJsonExample(void)
  130. {
  131. char *str = NULL;
  132. RyanJson_t jsonRoot;
  133. const char *jsonstr = "{\"name\":\"Mash\",\"star\":4,\"hits\":[2,2,1,3]}";
  134. // 解析json数据
  135. jsonRoot = RyanJsonParse(jsonstr);
  136. if (jsonRoot == NULL)
  137. {
  138. printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
  139. return -1;
  140. }
  141. RyanJsonChangeStringValue(RyanJsonGetObjectByKey(jsonRoot, "name"), "Ryan");
  142. if (0 != strcmp("Ryan", RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "name"))))
  143. {
  144. printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
  145. RyanJsonDelete(jsonRoot);
  146. return -1;
  147. }
  148. RyanJsonReplaceByKey(jsonRoot, "star", RyanJsonCreateString("", "123456"));
  149. // 将序列化的数据以有格式样式打印出来
  150. uint32_t len = 0;
  151. str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
  152. printf("strLen: %" PRIu32 ", data: %s\r\n", len, str);
  153. RyanJsonFree(str);
  154. // 删除json对象
  155. RyanJsonDelete(jsonRoot);
  156. return 0;
  157. }
  158. RyanJsonBool_e RyanJsonExample(void)
  159. {
  160. RyanJsonInitHooks(v_malloc, v_free, v_realloc);
  161. printf("\r\n--------------------------- RyanJson 生成示例 --------------------------\r\n");
  162. createJsonExample();
  163. printf("\r\n--------------------------- RyanJson 序列化json文本示例 --------------------------\r\n");
  164. loadJsonExample();
  165. printf("\r\n--------------------------- RyanJson 修改json示例 --------------------------\r\n");
  166. changeJsonExample();
  167. return RyanJsonTrue;
  168. }