RyanJsonBaseTestReplaceJson.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "RyanJsonBaseTest.h"
  2. /* --------------------------------------------------------------------- */
  3. RyanJsonBool_e RyanJsonBaseTestReplaceJson(void)
  4. {
  5. char jsonstr[] =
  6. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":"
  7. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},"
  8. "\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],"
  9. "\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],"
  10. "\"array\":[16,16.89,\"hello\",true,false,null],"
  11. "\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},"
  12. "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}],"
  13. "\"string2222\":\"hello\"}";
  14. RyanJson_t json = RyanJsonParse(jsonstr);
  15. RyanJsonCheckReturnFalse(NULL != json);
  16. /* ---------------- 保留原有测试(并补充校验) ---------------- */
  17. // 数组替换测试:arrayInt 头
  18. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0, RyanJsonCreateString(NULL, "arrayInt"));
  19. {
  20. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0);
  21. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  22. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "arrayInt") == 0, { goto err; });
  23. }
  24. // 数组替换测试:arrayInt 尾
  25. {
  26. RyanJson_t arr = RyanJsonGetObjectToKey(json, "arrayInt");
  27. uint32_t last = RyanJsonGetSize(arr) - 1;
  28. RyanJsonReplaceByIndex(arr, last, RyanJsonCreateString(NULL, "arrayInt"));
  29. RyanJson_t v = RyanJsonGetObjectToIndex(arr, last);
  30. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  31. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "arrayInt") == 0, { goto err; });
  32. }
  33. // 数组对象替换测试:arrayItem[0]
  34. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0, RyanJsonCreateString(NULL, "arrayItem"));
  35. {
  36. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0);
  37. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  38. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "arrayItem") == 0, { goto err; });
  39. }
  40. // 数组对象替换测试:arrayItem[1]
  41. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 1, RyanJsonCreateString(NULL, "arrayItem"));
  42. {
  43. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 1);
  44. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  45. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "arrayItem") == 0, { goto err; });
  46. }
  47. // 对象字段替换:inter -> 999
  48. RyanJsonReplaceByKey(json, "inter", RyanJsonCreateInt("inter", 999));
  49. {
  50. RyanJson_t v = RyanJsonGetObjectToKey(json, "inter");
  51. RyanJsonCheckCode(RyanJsonIsInt(v), { goto err; });
  52. RyanJsonCheckCode(RyanJsonGetIntValue(v) == 999, { goto err; });
  53. }
  54. // 对象字段替换:double -> 123.45
  55. RyanJsonReplaceByKey(json, "double", RyanJsonCreateDouble("double", 123.45));
  56. {
  57. RyanJson_t v = RyanJsonGetObjectToKey(json, "double");
  58. RyanJsonCheckCode(RyanJsonIsDouble(v), { goto err; });
  59. RyanJsonCheckCode(RyanJsonGetDoubleValue(v) == 123.45, { goto err; });
  60. }
  61. // 对象字段替换:string -> "newString"
  62. RyanJsonReplaceByKey(json, "string", RyanJsonCreateString("string", "newString"));
  63. {
  64. RyanJson_t v = RyanJsonGetObjectToKey(json, "string");
  65. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  66. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "newString") == 0, { goto err; });
  67. }
  68. // 对象字段替换:boolFalse -> true
  69. RyanJsonReplaceByKey(json, "boolFalse", RyanJsonCreateBool("boolFalse", RyanJsonTrue));
  70. {
  71. RyanJson_t v = RyanJsonGetObjectToKey(json, "boolFalse");
  72. RyanJsonCheckCode(RyanJsonIsBool(v), { goto err; });
  73. RyanJsonCheckCode(RyanJsonGetBoolValue(v) == RyanJsonTrue, { goto err; });
  74. }
  75. // 数组替换:arrayInt 中间元素 -> "midInt"
  76. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 2, RyanJsonCreateString(NULL, "midInt"));
  77. {
  78. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 2);
  79. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  80. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "midInt") == 0, { goto err; });
  81. }
  82. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayString"), 1, RyanJsonCreateString(NULL, "headString"));
  83. {
  84. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayString"), 1);
  85. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  86. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "headString") == 0, { goto err; });
  87. }
  88. {
  89. RyanJson_t arr = RyanJsonGetObjectToKey(json, "arrayString");
  90. uint32_t last = RyanJsonGetSize(arr) - 1;
  91. RyanJsonReplaceByIndex(arr, last, RyanJsonCreateString(NULL, "tailString"));
  92. RyanJson_t v = RyanJsonGetObjectToIndex(arr, last);
  93. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  94. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "tailString") == 0, { goto err; });
  95. }
  96. // 数组对象替换:arrayItem 尾部 -> "arrayItemTail"
  97. {
  98. RyanJson_t arr = RyanJsonGetObjectToKey(json, "arrayItem");
  99. uint32_t last = RyanJsonGetSize(arr) - 1;
  100. RyanJsonReplaceByIndex(arr, last, RyanJsonCreateString(NULL, "arrayItemTail"));
  101. RyanJson_t v = RyanJsonGetObjectToIndex(arr, last);
  102. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  103. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "arrayItemTail") == 0, { goto err; });
  104. }
  105. // 嵌套对象替换:item.inter -> 111
  106. RyanJsonReplaceByKey(RyanJsonGetObjectToKey(json, "item"), "inter", RyanJsonCreateInt("inter", 111));
  107. {
  108. RyanJson_t v = RyanJsonGetObjectToKey(RyanJsonGetObjectToKey(json, "item"), "inter");
  109. RyanJsonCheckCode(RyanJsonIsInt(v), { goto err; });
  110. RyanJsonCheckCode(RyanJsonGetIntValue(v) == 111, { goto err; });
  111. }
  112. // 嵌套对象替换:item.string -> "nestedReplace"
  113. RyanJsonReplaceByKey(RyanJsonGetObjectToKey(json, "item"), "string", RyanJsonCreateString("string", "nestedReplace"));
  114. {
  115. RyanJson_t v = RyanJsonGetObjectToKey(RyanJsonGetObjectToKey(json, "item"), "string");
  116. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  117. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "nestedReplace") == 0, { goto err; });
  118. }
  119. // 混合数组替换:各类型位置
  120. // 0:int -> "intReplaced"
  121. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "array"), 0, RyanJsonCreateString(NULL, "intReplaced"));
  122. {
  123. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "array"), 0);
  124. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  125. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "intReplaced") == 0, { goto err; });
  126. }
  127. // 1:double -> "doubleReplaced"
  128. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "array"), 1, RyanJsonCreateString(NULL, "doubleReplaced"));
  129. {
  130. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "array"), 1);
  131. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  132. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "doubleReplaced") == 0, { goto err; });
  133. }
  134. // 2:string -> "stringReplaced"
  135. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "array"), 2, RyanJsonCreateString(NULL, "stringReplaced"));
  136. {
  137. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "array"), 2);
  138. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  139. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "stringReplaced") == 0, { goto err; });
  140. }
  141. // 3:bool -> "boolReplaced"
  142. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "array"), 3, RyanJsonCreateString(NULL, "boolReplaced"));
  143. {
  144. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "array"), 3);
  145. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  146. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "boolReplaced") == 0, { goto err; });
  147. }
  148. // 5:null -> "nullReplaced"
  149. RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "array"), 5, RyanJsonCreateString(NULL, "nullReplaced"));
  150. {
  151. RyanJson_t v = RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "array"), 5);
  152. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  153. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "nullReplaced") == 0, { goto err; });
  154. }
  155. // 对象替换测试:arrayString -> "arrayString2222"
  156. RyanJsonReplaceByKey(json, "arrayString", RyanJsonCreateString("", "arrayString2222"));
  157. {
  158. RyanJson_t v = RyanJsonGetObjectToKey(json, "arrayString");
  159. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  160. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "arrayString2222") == 0, { goto err; });
  161. }
  162. // 修改数组节点为对象节点:arrayDouble -> duplicate(item)
  163. RyanJson_t duplicateJson = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
  164. RyanJsonReplaceByKey(json, "arrayDouble", duplicateJson);
  165. {
  166. RyanJson_t v = RyanJsonGetObjectToKey(json, "arrayDouble");
  167. RyanJsonCheckCode(RyanJsonIsObject(v), { goto err; });
  168. }
  169. // 替换普通 key 的值:string2222 -> "world"
  170. RyanJsonReplaceByKey(json, "string2222", RyanJsonCreateString("string2222", "world"));
  171. {
  172. RyanJson_t v = RyanJsonGetObjectToKey(json, "string2222");
  173. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  174. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "world") == 0, { goto err; });
  175. }
  176. // 替换布尔值:boolTrue -> false
  177. RyanJsonReplaceByKey(json, "boolTrue", RyanJsonCreateBool("boolTrue", RyanJsonFalse));
  178. {
  179. RyanJson_t v = RyanJsonGetObjectToKey(json, "boolTrue");
  180. RyanJsonCheckCode(RyanJsonIsBool(v), { goto err; });
  181. RyanJsonCheckCode(RyanJsonGetBoolValue(v) == RyanJsonFalse, { goto err; });
  182. }
  183. // 替换 null:null -> "notNull"
  184. RyanJsonReplaceByKey(json, "null", RyanJsonCreateString("null", "notNull"));
  185. {
  186. RyanJson_t v = RyanJsonGetObjectToKey(json, "null");
  187. RyanJsonCheckCode(RyanJsonIsString(v), { goto err; });
  188. RyanJsonCheckCode(strcmp(RyanJsonGetStringValue(v), "notNull") == 0, { goto err; });
  189. }
  190. char *str = RyanJsonPrint(json, 1024, RyanJsonTrue, NULL);
  191. RyanJsonFree(str);
  192. RyanJsonDelete(json);
  193. return RyanJsonTrue;
  194. err:
  195. RyanJsonDelete(json);
  196. return RyanJsonFalse;
  197. }