فهرست منبع

chore: 优化目录,更新cjson和yyjson

RyanCW 4 ماه پیش
والد
کامیت
7ce7412176
100فایلهای تغییر یافته به همراه2326 افزوده شده و 5014 حذف شده
  1. 120 0
      .clang-format
  2. 2 0
      .clang-format-ignore
  3. 79 0
      .clang-tidy
  4. 0 27
      .vscode/launch.json
  5. 29 18
      .vscode/settings.json
  6. 0 46
      .vscode/tasks.json
  7. 506 443
      RyanJson/RyanJson.c
  8. 141 135
      RyanJson/RyanJson.h
  9. 0 299
      RyanJsonExample/RFC8259JsonTest.c
  10. 0 191
      RyanJsonExample/RyanJsonExample.c
  11. 0 106
      RyanJsonExample/RyanJsonMemoryFootprintTest.c
  12. 0 1144
      RyanJsonExample/RyanJsonTest.c
  13. 0 48
      RyanJsonExample/main.c
  14. 0 81
      RyanJsonExample/valloc/valloc.c
  15. 191 0
      example/RyanJsonExample.c
  16. 261 228
      externalModule/cJSON/cJSON.c
  17. 17 16
      externalModule/cJSON/cJSON.h
  18. 650 2046
      externalModule/yyjson/yyjson.c
  19. 330 186
      externalModule/yyjson/yyjson.h
  20. 0 0
      test/RFC8259JsonData/i_number_double_huge_neg_exp.json
  21. 0 0
      test/RFC8259JsonData/i_number_huge_exp.json
  22. 0 0
      test/RFC8259JsonData/i_number_neg_int_huge_exp.json
  23. 0 0
      test/RFC8259JsonData/i_number_pos_double_huge_exp.json
  24. 0 0
      test/RFC8259JsonData/i_number_real_neg_overflow.json
  25. 0 0
      test/RFC8259JsonData/i_number_real_pos_overflow.json
  26. 0 0
      test/RFC8259JsonData/i_number_real_underflow.json
  27. 0 0
      test/RFC8259JsonData/i_number_too_big_neg_int.json
  28. 0 0
      test/RFC8259JsonData/i_number_too_big_pos_int.json
  29. 0 0
      test/RFC8259JsonData/i_number_very_big_negative_int.json
  30. 0 0
      test/RFC8259JsonData/i_object_key_lone_2nd_surrogate.json
  31. 0 0
      test/RFC8259JsonData/i_string_1st_surrogate_but_2nd_missing.json
  32. 0 0
      test/RFC8259JsonData/i_string_1st_valid_surrogate_2nd_invalid.json
  33. 0 0
      test/RFC8259JsonData/i_string_UTF-16LE_with_BOM.json
  34. 0 0
      test/RFC8259JsonData/i_string_UTF-8_invalid_sequence.json
  35. 0 0
      test/RFC8259JsonData/i_string_UTF8_surrogate_U+D800.json
  36. 0 0
      test/RFC8259JsonData/i_string_incomplete_surrogate_and_escape_valid.json
  37. 0 0
      test/RFC8259JsonData/i_string_incomplete_surrogate_pair.json
  38. 0 0
      test/RFC8259JsonData/i_string_incomplete_surrogates_escape_valid.json
  39. 0 0
      test/RFC8259JsonData/i_string_invalid_lonely_surrogate.json
  40. 0 0
      test/RFC8259JsonData/i_string_invalid_surrogate.json
  41. 0 0
      test/RFC8259JsonData/i_string_invalid_utf-8.json
  42. 0 0
      test/RFC8259JsonData/i_string_inverted_surrogates_U+1D11E.json
  43. 0 0
      test/RFC8259JsonData/i_string_iso_latin_1.json
  44. 0 0
      test/RFC8259JsonData/i_string_lone_second_surrogate.json
  45. 0 0
      test/RFC8259JsonData/i_string_lone_utf8_continuation_byte.json
  46. 0 0
      test/RFC8259JsonData/i_string_not_in_unicode_range.json
  47. 0 0
      test/RFC8259JsonData/i_string_overlong_sequence_2_bytes.json
  48. 0 0
      test/RFC8259JsonData/i_string_overlong_sequence_6_bytes.json
  49. 0 0
      test/RFC8259JsonData/i_string_overlong_sequence_6_bytes_null.json
  50. 0 0
      test/RFC8259JsonData/i_string_truncated-utf-8.json
  51. 0 0
      test/RFC8259JsonData/i_string_utf16BE_no_BOM.json
  52. 0 0
      test/RFC8259JsonData/i_string_utf16LE_no_BOM.json
  53. 0 0
      test/RFC8259JsonData/i_structure_500_nested_arrays.json
  54. 0 0
      test/RFC8259JsonData/i_structure_UTF-8_BOM_empty_object.json
  55. 0 0
      test/RFC8259JsonData/n_array_1_true_without_comma.json
  56. 0 0
      test/RFC8259JsonData/n_array_a_invalid_utf8.json
  57. 0 0
      test/RFC8259JsonData/n_array_colon_instead_of_comma.json
  58. 0 0
      test/RFC8259JsonData/n_array_comma_after_close.json
  59. 0 0
      test/RFC8259JsonData/n_array_comma_and_number.json
  60. 0 0
      test/RFC8259JsonData/n_array_double_comma.json
  61. 0 0
      test/RFC8259JsonData/n_array_double_extra_comma.json
  62. 0 0
      test/RFC8259JsonData/n_array_extra_close.json
  63. 0 0
      test/RFC8259JsonData/n_array_extra_comma.json
  64. 0 0
      test/RFC8259JsonData/n_array_incomplete.json
  65. 0 0
      test/RFC8259JsonData/n_array_incomplete_invalid_value.json
  66. 0 0
      test/RFC8259JsonData/n_array_inner_array_no_comma.json
  67. 0 0
      test/RFC8259JsonData/n_array_invalid_utf8.json
  68. 0 0
      test/RFC8259JsonData/n_array_items_separated_by_semicolon.json
  69. 0 0
      test/RFC8259JsonData/n_array_just_comma.json
  70. 0 0
      test/RFC8259JsonData/n_array_just_minus.json
  71. 0 0
      test/RFC8259JsonData/n_array_missing_value.json
  72. 0 0
      test/RFC8259JsonData/n_array_newlines_unclosed.json
  73. 0 0
      test/RFC8259JsonData/n_array_number_and_comma.json
  74. 0 0
      test/RFC8259JsonData/n_array_number_and_several_commas.json
  75. 0 0
      test/RFC8259JsonData/n_array_spaces_vertical_tab_formfeed.json
  76. 0 0
      test/RFC8259JsonData/n_array_star_inside.json
  77. 0 0
      test/RFC8259JsonData/n_array_unclosed.json
  78. 0 0
      test/RFC8259JsonData/n_array_unclosed_trailing_comma.json
  79. 0 0
      test/RFC8259JsonData/n_array_unclosed_with_new_lines.json
  80. 0 0
      test/RFC8259JsonData/n_array_unclosed_with_object_inside.json
  81. 0 0
      test/RFC8259JsonData/n_incomplete_false.json
  82. 0 0
      test/RFC8259JsonData/n_incomplete_null.json
  83. 0 0
      test/RFC8259JsonData/n_incomplete_true.json
  84. 0 0
      test/RFC8259JsonData/n_multidigit_number_then_00.json
  85. 0 0
      test/RFC8259JsonData/n_number_++.json
  86. 0 0
      test/RFC8259JsonData/n_number_+1.json
  87. 0 0
      test/RFC8259JsonData/n_number_+Inf.json
  88. 0 0
      test/RFC8259JsonData/n_number_-01.json
  89. 0 0
      test/RFC8259JsonData/n_number_-1.0..json
  90. 0 0
      test/RFC8259JsonData/n_number_-2..json
  91. 0 0
      test/RFC8259JsonData/n_number_-NaN.json
  92. 0 0
      test/RFC8259JsonData/n_number_.-1.json
  93. 0 0
      test/RFC8259JsonData/n_number_.2e-3.json
  94. 0 0
      test/RFC8259JsonData/n_number_0.1.2.json
  95. 0 0
      test/RFC8259JsonData/n_number_0.3e+.json
  96. 0 0
      test/RFC8259JsonData/n_number_0.3e.json
  97. 0 0
      test/RFC8259JsonData/n_number_0.e1.json
  98. 0 0
      test/RFC8259JsonData/n_number_0_capital_E+.json
  99. 0 0
      test/RFC8259JsonData/n_number_0_capital_E.json
  100. 0 0
      test/RFC8259JsonData/n_number_0e+.json

+ 120 - 0
.clang-format

@@ -0,0 +1,120 @@
+# SPDX-License-Identifier: Apache-2.0
+#
+# Note: The list of ForEachMacros can be obtained using:
+#
+#    git grep -h '^#define [^[:space:]]*FOR_EACH[^[:space:]]*(' include/ \
+#    | sed "s,^#define \([^[:space:]]*FOR_EACH[^[:space:]]*\)(.*$,  - '\1'," \
+#    | sort | uniq
+#
+# References:
+#   - https://clang.llvm.org/docs/ClangFormatStyleOptions.html
+
+---
+# 基于 LLVM 的代码风格
+BasedOnStyle: LLVM
+# 连续宏定义的对齐方式:跨注释对齐
+AlignConsecutiveMacros:
+  Enabled: true
+  AcrossComments: true
+# 短代码块不允许单行显示
+AllowShortBlocksOnASingleLine: Never
+# 短 case 标签不允许单行显示
+AllowShortCaseLabelsOnASingleLine: true
+# 短枚举不允许单行显示
+AllowShortEnumsOnASingleLine: false
+# 短函数不允许单行显示(None 表示对所有函数都应用此规则)
+AllowShortFunctionsOnASingleLine: None
+# 短 if 语句不允许单行显示
+AllowShortIfStatementsOnASingleLine: true
+# 短循环不允许单行显示
+AllowShortLoopsOnASingleLine: true
+
+# 属性宏列表
+AttributeMacros:
+  - __aligned
+  - __deprecated
+  - __packed
+  - __printf_like
+  - __syscall
+  - __syscall_always_inline
+  - __subsystem
+
+# 位字段冒号后的空格位置:冒号后
+BitFieldColonSpacing: After
+
+BreakBeforeBraces: Custom
+BraceWrapping:
+  AfterCaseLabel: false
+  AfterClass: true
+  AfterControlStatement: Always
+  AfterEnum: true
+  AfterExternBlock: false
+  AfterFunction: true
+  AfterNamespace: true
+  AfterObjCDeclaration: true
+  AfterStruct: true
+  AfterUnion: false
+  BeforeCatch: true
+  BeforeElse: true
+  BeforeLambdaBody: false
+  BeforeWhile: false
+  IndentBraces: false
+  SplitEmptyFunction: true
+  SplitEmptyRecord: true
+  SplitEmptyNamespace: true
+
+# 单行代码的最大列数
+ColumnLimit: 200
+# 构造函数初始化列表的缩进宽度
+ConstructorInitializerIndentWidth: 8
+# 折行缩进宽度
+ContinuationIndentWidth: 8
+# ForEach 宏列表
+ForEachMacros:
+  - "ARRAY_FOR_EACH"
+  - "ARRAY_FOR_EACH_PTR"
+  - "FOR_EACH"
+
+# If 宏列表
+IfMacros:
+  - "CHECKIF"
+
+# 包含文件的分类和优先级
+IncludeCategories:
+  - Regex: '^".*\.h"$'
+    Priority: 0
+  - Regex: '^<(assert|complex|ctype|errno|fenv|float|inttypes|limits|locale|math|setjmp|signal|stdarg|stdbool|stddef|stdint|stdio|stdlib|string|tgmath|time|wchar|wctype)\.h>$'
+    Priority: 1
+  - Regex: '^\<Ryan/.*\.h\>$'
+    Priority: 2
+  - Regex: ".*"
+    Priority: 3
+
+# case 标签不缩进
+IndentCaseLabels: false
+# goto 标签不缩进
+IndentGotoLabels: false
+# 缩进宽度
+IndentWidth: 8
+# 自动插入大括号
+InsertBraces: true
+# 文件末尾自动插入新行
+InsertNewlineAtEOF: true
+# 继承冒号前不加空格
+SpaceBeforeInheritanceColon: False
+# 控制语句(除了控制宏)前加空格
+SpaceBeforeParens: ControlStatementsExceptControlMacros
+# 从不排序包含文件
+SortIncludes: Never
+# 使用制表符进行续行和缩进
+UseTab: ForContinuationAndIndentation
+# 对空白字符敏感的宏列表
+WhitespaceSensitiveMacros:
+  - COND_CODE_0
+  - COND_CODE_1
+  - IF_DISABLED
+  - IF_ENABLED
+  - LISTIFY
+  - STRINGIFY
+  - Z_STRINGIFY
+  - DT_FOREACH_PROP_ELEM_SEP

+ 2 - 0
.clang-format-ignore

@@ -0,0 +1,2 @@
+# 忽略coreMqtt
+externalModule/*

+ 79 - 0
.clang-tidy

@@ -0,0 +1,79 @@
+# abseil-   与 Abseil 库相关的检查。
+# altera-   与用于 FPGA 的开源 CL 编程相关的检查。
+# android-    与 Android 相关的检查。
+# boost-    与 Boost 库相关的检查。
+# bugprone-   检查易出错代码结构。
+# cert-   与 CERT 安全编码指南相关的检查。
+# clang-analyzer-Clang    静态分析器检查。
+# concurrency-    与并发编程相关的检查(包括线程、纤程、协程等)。
+# cppcoreguidelines-    与 C++核心指南相关的检查。
+# darwin-   与达尔文编码规范相关的检查。
+# fuchsia-    与 Fuchsia 编码规范相关的检查。
+# google-   与 Google 编码规范相关的检查。
+# hicpp-    与高完整性 C++编码标准相关的检查。
+# linuxkernel-    与 Linux 内核编码规范相关的检查。
+# llvm-   与 LLVM 编码规范相关的检查。
+# llvmlibc-   与 LLVM-libc 编码标准相关的检查。
+# misc-   我们没有一个更好的类别的检查。
+# modernize-    提倡使用现代(目前“现代”意味着“C++11”)语言结构的检查。
+# mpi-    与 MPI(消息传递接口)相关的检查。
+# objc-   与 Objective-C 编码规范相关的检查。
+# openmp-   与 OpenMP API 相关的检查。
+# performance-    针对性能相关问题的检查。
+# portability-    针对与特定编码风格无关的可移植性问题进行检查。
+# readability-    检查与特定编码风格无关的目标可读性问题。
+# zircon-     检查与 Zircon 内核编码约定相关的内容。
+
+# Checks: '-*,clang-diagnostic-*,llvm-*,misc-*,-misc-const-correctness,-misc-unused-parameters,-misc-non-private-member-variables-in-classes,-misc-no-recursion,-misc-use-anonymous-namespace,readability-identifier-naming,-misc-include-cleaner'
+
+Checks: 
+  - "-*,clang-diagnostic-*,clang-analyzer-*,llvm-*,concurrency-*,performance-*,cert-*"
+  # 静默的窄化转换交给编译器来判断?
+  - 'bugprone-*,-bugprone-easily-swappable-parameters'
+  - 'readability-identifier-naming'
+  - 'misc-*,-misc-const-correctness,-misc-unused-parameters,-misc-non-private-member-variables-in-classes,-misc-no-recursion,-misc-use-anonymous-namespace,-misc-include-cleaner'
+
+CheckOptions:
+  # 类名使用帕斯卡命名法(如 MyClass)
+  - key: readability-identifier-naming.ClassCase
+    value: camelCase
+
+  # 枚举名使用帕斯卡命名法(如 ColorMode)
+  - key: readability-identifier-naming.EnumCase
+    value: camelCase
+
+  # 函数名使用驼峰命名法(如 getValue())
+  - key: readability-identifier-naming.FunctionCase
+    value: camelBack,CamelBack
+
+  # 忽略符合正则表达式的函数名(常用于兼容外部接口)
+  - key: readability-identifier-naming.FunctionIgnoredRegexp
+    value: "LLVMFuzzerTestOneInput"
+
+  # 成员变量名使用帕斯卡命名法(如 MemberVar)
+  - key: readability-identifier-naming.MemberCase
+    value: camelCase
+
+  # 参数名使用帕斯卡命名法(如 ParamName)
+  - key: readability-identifier-naming.ParameterCase
+    value: camelBack
+
+  # 联合体名使用帕斯卡命名法(如 MyUnion)
+  - key: readability-identifier-naming.UnionCase
+    value: camelCase
+
+  # 变量名使用帕斯卡命名法(如 LocalVar)
+  - key: readability-identifier-naming.VariableCase
+    value: camelCase
+
+  # 忽略main-like函数(如测试入口函数)
+  - key: readability-identifier-naming.IgnoreMainLikeFunctions
+    value: 1
+
+  # 忽略拷贝构造函数中的基类成员初始化检查
+  - key: readability-redundant-member-init.IgnoreBaseInCopyConstructors
+    value: 1
+
+  # 使用赋值初始化而非就地初始化(C++11特性)
+  - key: modernize-use-default-member-init.UseAssignment
+    value: 1

+ 0 - 27
.vscode/launch.json

@@ -1,27 +0,0 @@
-{
-    // 使用 IntelliSense 了解相关属性。
-    // 悬停以查看现有属性的描述。
-    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
-    "version": "0.2.0",
-    "configurations": [
-        {
-            "name": "gcc.exe - 生成和调试活动文件",
-            "type": "cppdbg",
-            "request": "launch",
-            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
-            "args": [],
-            "stopAtEntry": false,
-            "cwd": "${fileDirname}",
-            "environment": [],
-            "externalConsole": false,
-            "setupCommands": [
-                {
-                    "description": "为 gdb 启用整齐打印",
-                    "text": "-enable-pretty-printing",
-                    "ignoreFailures": true
-                }
-            ],
-            "preLaunchTask": "C/C++: gcc.exe 生成活动文件"
-        }
-    ]
-}

+ 29 - 18
.vscode/settings.json

@@ -1,24 +1,35 @@
 {
+    "clangd.enable": false,
+    "C_Cpp.intelliSenseEngine": "default",
+    "C_Cpp.codeAnalysis.clangTidy.enabled": true,
+    "c-cpp-flylint.enable": true,
+    "c-cpp-flylint.cppcheck.severityLevels": {
+        "error": "Error",
+        "warning": "Warning",
+        "style": "Information",
+        "performance": "Information",
+        "portability": "Information",
+        "information": "Information"
+    },
+    "c-cpp-flylint.cppcheck.extraArgs": [
+        // "--suppress=constParameterPointer",
+        // "--suppress=constParameterCallback",
+        "--check-level=exhaustive",
+        // "--suppress=variableScope",
+        // "--suppress=unreadVariable",
+        // "--suppress=constVariablePointer",
+        // "--suppress=constParameter",
+    ],
     "files.associations": {
-        "valloc.h": "c",
-        "json.h": "c",
-        "jansson.h": "c",
-        "jansson_private.h": "c",
-        "jansson_config.h": "c",
-        "hashtable.h": "c",
-        "stddef.h": "c",
+        "*.c": "c",
+        "inttypes.h": "c",
+        "float.h": "c",
         "stdlib.h": "c",
-        "string.h": "c",
-        "cstdarg": "c",
-        "type_traits": "c",
         "limits.h": "c",
-        "cmath": "c",
-        "ryanjson.h": "c",
-        "cjson.h": "c",
-        "unity.h": "c",
-        "unity_config.h": "c",
-        "common.h": "c",
-        "stdio.h": "c"
+        "stdio.h": "c",
+        "stdint.h": "c",
+        "ryanjsontest.h": "c",
+        "dirent.h": "c",
+        "valloc.h": "c"
     },
-    "commentTranslate.source": "Google"
 }

+ 0 - 46
.vscode/tasks.json

@@ -1,46 +0,0 @@
-{
-    "tasks": [
-        {
-            "type": "cppbuild",
-            "label": "C/C++: gcc.exe 生成活动文件",
-            "command": "E:\\software\\mingw-w64\\mingw64\\bin\\gcc.exe",
-            "args": [
-                "-fdiagnostics-color=always",
-                // "${file}",
-                // "-m32",
-                "-std=c99",
-                "-g",
-                "-O0",
-                "-Werror",
-                // "-Wextra",
-                // "-Wall",
-                "${cwd}\\**.c",
-                // "${cwd}\\**.h",
-                "${cwd}\\RyanJson\\**.c",
-                "${cwd}\\RyanJson\\**.h",
-                "${cwd}\\cJSON\\**.c",
-                "${cwd}\\cJSON\\**.h",
-                "${cwd}\\yyjson\\**.c",
-                "${cwd}\\yyjson\\**.h",
-                "${cwd}\\valloc\\**.c",
-                "${cwd}\\valloc\\**.h",
-                // "${cwd}\\tests\\**.c",
-                // "${cwd}\\tests\\**.h",
-                "-o",
-                "${fileDirname}\\${fileBasenameNoExtension}.exe"
-            ],
-            "options": {
-                "cwd": "${fileDirname}",
-            },
-            "problemMatcher": [
-                "$gcc"
-            ],
-            "group": {
-                "kind": "build",
-                "isDefault": true
-            },
-            "detail": "调试器生成的任务。"
-        }
-    ],
-    "version": "2.0.0"
-}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 506 - 443
RyanJson/RyanJson.c


+ 141 - 135
RyanJson/RyanJson.h

@@ -3,8 +3,7 @@
 #define __RyanJson__
 
 #ifdef __cplusplus
-extern "C"
-{
+extern "C" {
 #endif
 
 #include <stdio.h>
@@ -17,49 +16,59 @@ extern "C"
 #include <math.h>
 #include <inttypes.h>
 
-    typedef enum
-    {
-        // 类型标志 占用8字节,剩余一个备用
-        RyanJsonTypeUnknow = 1 << 0,
-        RyanJsonTypeNull = 1 << 1,
-        RyanJsonTypeBool = 1 << 2,
-        RyanJsonTypeNumber = 1 << 3,
-        RyanJsonTypeString = 1 << 4,
-        RyanJsonTypeArray = 1 << 5,
-        RyanJsonTypeObject = 1 << 6,
-    } RyanjsonType_e;
-
-    typedef enum
-    {
-        // flag标志
-        RyanJsonValueBoolTrueFlag = 1 << 8,
-        RyanJsonValueNumberIntFlag = 1 << 9,
-        RyanJsonWithKeyFlag = 1 << 10
-    } RyanJsonInfoFlag_e;
-
-    typedef enum
-    {
-        RyanJsonFalse = 0,
-        RyanJsonTrue = 1
-    } RyanJsonBool;
-
-    struct RyanJsonNode
-    {
-        uint32_t info;             // 包含类型,key等标志
-        struct RyanJsonNode *next; // 单链表node节点
-
-        // [char *key] 有key的json节点, 会动态创建指针
-
-        // 有value值的节点, 会动态创建指针
-        // [int32_t value / double value / char* value / RyanJson_t item]
-    };
-
-    typedef struct RyanJsonNode *RyanJson_t;
-
-    // 内存钩子函数
-    typedef void *(*malloc_t)(size_t size);
-    typedef void (*free_t)(void *block);
-    typedef void *(*realloc_t)(void *block, size_t size);
+#define RyanMqttMemset  memset
+#define RyanMqttMemcpy  memcpy
+#define RyanMqttStrlen  strlen
+#define RyanMqttStrncmp strncmp
+#define RyanMqttStrcmp  strcmp
+#define RyanMqttSprintf sprintf
+
+typedef enum
+{
+	// 类型标志 占用8字节,剩余一个备用
+	RyanJsonTypeUnknow = 1 << 0,
+	RyanJsonTypeNull = 1 << 1,
+	RyanJsonTypeBool = 1 << 2,
+	RyanJsonTypeNumber = 1 << 3,
+	RyanJsonTypeString = 1 << 4,
+	RyanJsonTypeArray = 1 << 5,
+	RyanJsonTypeObject = 1 << 6,
+} RyanjsonType_e;
+
+typedef enum
+{
+	// flag标志
+	RyanJsonValueBoolTrueFlag = 1 << 8,
+	RyanJsonValueNumberIntFlag = 1 << 9,
+	RyanJsonWithKeyFlag = 1 << 10
+} RyanJsonInfoFlag_e;
+
+typedef enum
+{
+	RyanJsonFalse = 0,
+	RyanJsonTrue = 1
+} RyanJsonBool_e;
+
+// !兼容之前的类型定义
+typedef RyanJsonBool_e RyanJsonBool;
+
+struct RyanJsonNode
+{
+	uint32_t info;             // 包含类型,key等标志
+	struct RyanJsonNode *next; // 单链表node节点
+
+	// [char *key] 有key的json节点, 会动态创建指针
+
+	// 有value值的节点, 会动态创建指针
+	// [int32_t value / double value / char* value / RyanJson_t item]
+};
+
+typedef struct RyanJsonNode *RyanJson_t;
+
+// 内存钩子函数
+typedef void *(*malloc_t)(size_t size);
+typedef void (*free_t)(void *block);
+typedef void *(*realloc_t)(void *block, size_t size);
 
 // 限制解析数组/对象中嵌套的深度
 // RyanJson使用递归 序列化/反序列化 json
@@ -77,125 +86,122 @@ extern "C"
 #define RyanJsonGetInfo(pJson) ((pJson) ? ((pJson)->info) : 0)
 // NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)
 #define RyanJsonGetType(pJson) ((RyanjsonType_e)((uint8_t)RyanJsonGetInfo(pJson)))
-    RyanJsonBool RyanJsonInsert(RyanJson_t pJson, int32_t index, RyanJson_t item);
-    void *RyanJsonGetValue(RyanJson_t pJson);
-    RyanJson_t RyanJsonGetObjectByIndexs(RyanJson_t pJson, int32_t index, ...);
-    RyanJson_t RyanJsonGetObjectByKeys(RyanJson_t pJson, char *key, ...);
-    RyanJsonBool RyanJsonReapplyString(char **dst, const char *src);
-    RyanJson_t RyanJsonCreateItem(const char *key, RyanJson_t item);
-
-    /**
-     * @brief json对象函数
-     */
-    RyanJsonBool RyanJsonInitHooks(malloc_t _malloc, free_t _free, realloc_t _realloc);
-    RyanJson_t RyanJsonParseOptions(const char *text, uint32_t size, RyanJsonBool require_null_terminated, const char **return_parse_end); // 需用户释放内存
-    static inline RyanJson_t RyanJsonParse(const char *text)                                                                               // 需用户释放内存
-    {
-        return RyanJsonParseOptions(text, strlen(text), RyanJsonFalse, NULL);
-    }
-
-    char *RyanJsonPrint(RyanJson_t pJson, uint32_t preset, RyanJsonBool format, uint32_t *len); // 需用户释放内存
-    char *RyanJsonPrintPreallocated(RyanJson_t pJson, char *buffer, uint32_t length, RyanJsonBool format, uint32_t *len);
-
-    RyanJson_t RyanJsonDuplicate(RyanJson_t pJson); // 需用户释放内存
-    uint32_t RyanJsonGetSize(RyanJson_t pJson);     // 获取Json中子项个数
-    void RyanJsonMinify(char *text);
-
-    void RyanJsonDelete(RyanJson_t pJson);
-    void RyanJsonFree(void *block);
-
-    RyanJsonBool RyanJsonCompare(RyanJson_t a, RyanJson_t b);
-    RyanJsonBool RyanJsonCompareOnlyKey(RyanJson_t a, RyanJson_t b);
-
-    /**
-     * @brief 添加 / 删除相关函数
-     */
-    RyanJson_t RyanJsonCreateObject();                              // 如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateNull(char *key);                       // 如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateBool(char *key, RyanJsonBool boolean); // 如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateInt(char *key, int32_t number);        // 如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateDouble(char *key, double number);      // 如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateString(char *key, const char *string); // 如果没有添加到父json, 则需释放内存
-
-    RyanJson_t RyanJsonCreateArray();                                           // 如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateIntArray(const int32_t *numbers, int32_t count);   // 语法糖,根据传入的numbers数组创建一个int类型的数组。如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateDoubleArray(const double *numbers, int32_t count); // 语法糖,根据传入的numbers数组创建一个double类型的数组。如果没有添加到父json, 则需释放内存
-    RyanJson_t RyanJsonCreateStringArray(const char **strings, int32_t count);  // 语法糖,根据传入的strings数组创建一个string类型的数组。如果没有添加到父json, 则需释放内存
-
-    RyanJson_t RyanJsonDetachByIndex(RyanJson_t pJson, int32_t index); // 需用户释放内存
-    RyanJson_t RyanJsonDetachByKey(RyanJson_t pJson, const char *key); // 需用户释放内存
-    RyanJsonBool RyanJsonDeleteByIndex(RyanJson_t pJson, int32_t index);
-    RyanJsonBool RyanJsonDeleteByKey(RyanJson_t pJson, const char *key);
-
-    /**
-     * @brief 查询函数
-     */
-    RyanJson_t RyanJsonGetObjectByKey(RyanJson_t pJson, const char *key);
-    RyanJson_t RyanJsonGetObjectByIndex(RyanJson_t pJson, int32_t index);
-#define RyanJsonGetObjectToKey(pJson, key, ...) RyanJsonGetObjectByKeys(pJson, key, ##__VA_ARGS__, NULL)
+extern RyanJsonBool_e RyanJsonInsert(RyanJson_t pJson, int32_t index, RyanJson_t item);
+extern void *RyanJsonGetValue(RyanJson_t pJson);
+extern RyanJson_t RyanJsonGetObjectByIndexs(RyanJson_t pJson, int32_t index, ...);
+extern RyanJson_t RyanJsonGetObjectByKeys(RyanJson_t pJson, char *key, ...);
+extern RyanJsonBool_e RyanJsonReapplyString(char **dst, const char *src);
+extern RyanJson_t RyanJsonCreateItem(const char *key, RyanJson_t item);
+
+/**
+ * @brief json对象函数
+ */
+extern RyanJsonBool_e RyanJsonInitHooks(malloc_t _malloc, free_t _free, realloc_t _realloc);
+extern RyanJson_t RyanJsonParseOptions(const char *text, uint32_t size, RyanJsonBool_e mustBeNullTerminated, const char **parseEndPtr); // 需用户释放内存
+#define RyanJsonParse(text) RyanJsonParseOptions(text, strlen(text), RyanJsonFalse, NULL)                                               // 需用户释放内存
+
+extern char *RyanJsonPrint(RyanJson_t pJson, uint32_t preset, RyanJsonBool_e format, uint32_t *len); // 需用户释放内存
+extern char *RyanJsonPrintPreallocated(RyanJson_t pJson, char *buffer, uint32_t length, RyanJsonBool_e format, uint32_t *len);
+
+extern RyanJson_t RyanJsonDuplicate(RyanJson_t pJson); // 需用户释放内存
+extern uint32_t RyanJsonGetSize(RyanJson_t pJson);     // 获取Json中子项个数
+extern void RyanJsonMinify(char *text);
+
+extern void RyanJsonDelete(RyanJson_t pJson);
+extern void RyanJsonFree(void *block);
+
+extern RyanJsonBool_e RyanJsonCompare(RyanJson_t a, RyanJson_t b);
+extern RyanJsonBool_e RyanJsonCompareOnlyKey(RyanJson_t a, RyanJson_t b);
+
+/**
+ * @brief 添加 / 删除相关函数
+ */
+extern RyanJson_t RyanJsonCreateObject(void);                            // 如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateNull(char *key);                         // 如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateBool(char *key, RyanJsonBool_e boolean); // 如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateInt(char *key, int32_t number);          // 如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateDouble(char *key, double number);        // 如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateString(char *key, const char *string);   // 如果没有添加到父json, 则需释放内存
+
+extern RyanJson_t RyanJsonCreateArray(void);                                       // 如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateIntArray(const int32_t *numbers, int32_t count);   // 语法糖,根据传入的numbers数组创建一个int类型的数组。如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateDoubleArray(const double *numbers, int32_t count); // 语法糖,根据传入的numbers数组创建一个double类型的数组。如果没有添加到父json, 则需释放内存
+extern RyanJson_t RyanJsonCreateStringArray(const char **strings, int32_t count);  // 语法糖,根据传入的strings数组创建一个string类型的数组。如果没有添加到父json, 则需释放内存
+
+extern RyanJson_t RyanJsonDetachByIndex(RyanJson_t pJson, int32_t index); // 需用户释放内存
+extern RyanJson_t RyanJsonDetachByKey(RyanJson_t pJson, const char *key); // 需用户释放内存
+extern RyanJsonBool_e RyanJsonDeleteByIndex(RyanJson_t pJson, int32_t index);
+extern RyanJsonBool_e RyanJsonDeleteByKey(RyanJson_t pJson, const char *key);
+
+/**
+ * @brief 查询函数
+ */
+extern RyanJson_t RyanJsonGetObjectByKey(RyanJson_t pJson, const char *key);
+extern RyanJson_t RyanJsonGetObjectByIndex(RyanJson_t pJson, int32_t index);
+#define RyanJsonGetObjectToKey(pJson, key, ...)     RyanJsonGetObjectByKeys(pJson, key, ##__VA_ARGS__, NULL)
 #define RyanJsonGetObjectToIndex(pJson, index, ...) RyanJsonGetObjectByIndexs(pJson, index, ##__VA_ARGS__, INT_MIN)
 
-#define RyanJsonHasObjectByKey(pJson, key) (RyanJsonGetObjectByKey(pJson, key) ? RyanJsonTrue : RyanJsonFalse)
-#define RyanJsonHasObjectByIndex(pJson, key) (RyanJsonGetObjectByIndex(pJson, index) ? RyanJsonTrue : RyanJsonFalse)
-#define RyanJsonHasObjectToKey(pJson, key, ...) (RyanJsonGetObjectByKeys(pJson, key, ##__VA_ARGS__, NULL) ? RyanJsonTrue : RyanJsonFalse)
+#define RyanJsonHasObjectByKey(pJson, key)        (RyanJsonGetObjectByKey(pJson, key) ? RyanJsonTrue : RyanJsonFalse)
+#define RyanJsonHasObjectByIndex(pJson, key)      (RyanJsonGetObjectByIndex(pJson, index) ? RyanJsonTrue : RyanJsonFalse)
+#define RyanJsonHasObjectToKey(pJson, key, ...)   (RyanJsonGetObjectByKeys(pJson, key, ##__VA_ARGS__, NULL) ? RyanJsonTrue : RyanJsonFalse)
 #define RyanJsonHasObjectToIndex(pJson, key, ...) (RyanJsonGetObjectByIndexs(pJson, index, ##__VA_ARGS__, INT_MIN) ? RyanJsonTrue : RyanJsonFalse)
 
-#define returnJsonBool(ex) ((ex) ? RyanJsonTrue : RyanJsonFalse)
-#define RyanJsonIsKey(pJson) returnJsonBool(RyanJsonGetInfo(pJson) & RyanJsonWithKeyFlag)
-#define RyanJsonIsNull(pJson) returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeNull)
-#define RyanJsonIsBool(pJson) returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeBool)
+#define returnJsonBool(ex)      ((ex) ? RyanJsonTrue : RyanJsonFalse)
+#define RyanJsonIsKey(pJson)    returnJsonBool(RyanJsonGetInfo(pJson) & RyanJsonWithKeyFlag)
+#define RyanJsonIsNull(pJson)   returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeNull)
+#define RyanJsonIsBool(pJson)   returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeBool)
 #define RyanJsonIsNumber(pJson) returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeNumber)
-#define RyanJsonIsInt(pJson) returnJsonBool(RyanJsonIsNumber(pJson) && (RyanJsonGetInfo(pJson) & RyanJsonValueNumberIntFlag))
+#define RyanJsonIsInt(pJson)    returnJsonBool(RyanJsonIsNumber(pJson) && (RyanJsonGetInfo(pJson) & RyanJsonValueNumberIntFlag))
 #define RyanJsonIsDouble(pJson) returnJsonBool(RyanJsonIsNumber(pJson) && !(RyanJsonGetInfo(pJson) & RyanJsonValueNumberIntFlag))
 #define RyanJsonIsString(pJson) returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeString)
-#define RyanJsonIsArray(pJson) returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeArray)
+#define RyanJsonIsArray(pJson)  returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeArray)
 #define RyanJsonIsObject(pJson) returnJsonBool(RyanJsonGetType(pJson) & RyanJsonTypeObject)
 
 //! get value函数使用前建议RyanJsonIsXXXX宏做好判断
-#define RyanJsonGetKey(pJson) (*(char **)((RyanJson_t)(pJson) + 1))
-#define RyanJsonGetNullValue(pJson) (NULL)
-#define RyanJsonGetBoolValue(pJson) (RyanJsonGetInfo(pJson) & RyanJsonValueBoolTrueFlag ? RyanJsonTrue : RyanJsonFalse)
-#define RyanJsonGetIntValue(pJson) (*(int32_t *)RyanJsonGetValue(pJson))
+#define RyanJsonGetKey(pJson)         (*(char **)((RyanJson_t)(pJson) + 1))
+#define RyanJsonGetNullValue(pJson)   (NULL)
+#define RyanJsonGetBoolValue(pJson)   (RyanJsonGetInfo(pJson) & RyanJsonValueBoolTrueFlag ? RyanJsonTrue : RyanJsonFalse)
+#define RyanJsonGetIntValue(pJson)    (*(int32_t *)RyanJsonGetValue(pJson))
 #define RyanJsonGetDoubleValue(pJson) (*(double *)RyanJsonGetValue(pJson))
 #define RyanJsonGetStringValue(pJson) (*(char **)RyanJsonGetValue(pJson))
-#define RyanJsonGetArrayValue(pJson) (*(RyanJson_t *)RyanJsonGetValue(pJson))
+#define RyanJsonGetArrayValue(pJson)  (*(RyanJson_t *)RyanJsonGetValue(pJson))
 #define RyanJsonGetObjectValue(pJson) (*(RyanJson_t *)RyanJsonGetValue(pJson))
 
 #define RyanJsonGetArraySize(pJson) RyanJsonGetSize(pJson)
 
 //! add函数使用前建议RyanJsonIsXXXX宏判断是否是对象 / 数组
-#define RyanJsonAddNullToObject(pJson, key) RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateNull(key))
-#define RyanJsonAddBoolToObject(pJson, key, boolean) RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateBool(key, boolean))
-#define RyanJsonAddIntToObject(pJson, key, number) RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateInt(key, number))
+#define RyanJsonAddNullToObject(pJson, key)           RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateNull(key))
+#define RyanJsonAddBoolToObject(pJson, key, boolean)  RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateBool(key, boolean))
+#define RyanJsonAddIntToObject(pJson, key, number)    RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateInt(key, number))
 #define RyanJsonAddDoubleToObject(pJson, key, number) RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateDouble(key, number))
 #define RyanJsonAddStringToObject(pJson, key, string) RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateString(key, string))
-#define RyanJsonAddItemToObject(pJson, key, item) RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateItem(key, item))
+#define RyanJsonAddItemToObject(pJson, key, item)     RyanJsonInsert(pJson, INT_MAX, RyanJsonCreateItem(key, item))
 
-#define RyanJsonAddNullToArray(pJson) RyanJsonAddNullToObject(pJson, NULL)
-#define RyanJsonAddBoolToArray(pJson, boolean) RyanJsonAddBoolToObject(pJson, NULL, boolean)
-#define RyanJsonAddIntToArray(pJson, number) RyanJsonAddIntToObject(pJson, NULL, number)
+#define RyanJsonAddNullToArray(pJson)           RyanJsonAddNullToObject(pJson, NULL)
+#define RyanJsonAddBoolToArray(pJson, boolean)  RyanJsonAddBoolToObject(pJson, NULL, boolean)
+#define RyanJsonAddIntToArray(pJson, number)    RyanJsonAddIntToObject(pJson, NULL, number)
 #define RyanJsonAddDoubleToArray(pJson, number) RyanJsonAddDoubleToObject(pJson, NULL, number)
 #define RyanJsonAddStringToArray(pJson, string) RyanJsonAddStringToObject(pJson, NULL, string)
-#define RyanJsonAddItemToArray(pJson, item) RyanJsonAddItemToObject(pJson, NULL, item)
+#define RyanJsonAddItemToArray(pJson, item)     RyanJsonAddItemToObject(pJson, NULL, item)
 
 // 便利函数
-#define RyanJsonArrayForEach(pJson, item) for ((item) = RyanJsonGetArrayValue(pJson); NULL != (item); (item) = (item)->next)
+#define RyanJsonArrayForEach(pJson, item)  for ((item) = RyanJsonGetArrayValue(pJson); NULL != (item); (item) = (item)->next)
 #define RyanJsonObjectForEach(pJson, item) for ((item) = RyanJsonGetObjectValue(pJson); NULL != (item); (item) = (item)->next)
 
-    /**
-     * @brief change函数
-     * !change函数没有对入参做校验,使用前请做使用RyanJsonIsXXXX宏做好判断
-     */
-#define RyanJsonChangeKey(pJson, key) (RyanJsonReapplyString(&RyanJsonGetKey(pJson), key))
+/**
+ * @brief change函数
+ * !change函数没有对入参做校验,使用前请做使用RyanJsonIsXXXX宏做好判断
+ */
+#define RyanJsonChangeKey(pJson, key)            (RyanJsonReapplyString(&RyanJsonGetKey(pJson), key))
 #define RyanJsonChangeStringValue(pJson, string) (RyanJsonReapplyString(&RyanJsonGetStringValue(pJson), string))
-#define RyanJsonChangeBoolValue(pJson, boolean) ((boolean) == RyanJsonTrue) ? ((pJson)->info |= (RyanJsonValueBoolTrueFlag)) : ((pJson)->info &= (~RyanJsonValueBoolTrueFlag))
-#define RyanJsonChangeIntValue(pJson, number) (RyanJsonGetIntValue(pJson) = (number))
+#define RyanJsonChangeBoolValue(pJson, boolean)  ((boolean) == RyanJsonTrue) ? ((pJson)->info |= (RyanJsonValueBoolTrueFlag)) : ((pJson)->info &= (~RyanJsonValueBoolTrueFlag))
+#define RyanJsonChangeIntValue(pJson, number)    (RyanJsonGetIntValue(pJson) = (number))
 #define RyanJsonChangeDoubleValue(pJson, number) (RyanJsonGetDoubleValue(pJson) = (number))
 
-    // 这是change方法的补充,当需要修改value类型时,使用此函数
-    // 请参考 changeJsonTest 示例,严格按照规则来使用
-    RyanJsonBool RyanJsonReplaceByKey(RyanJson_t pJson, const char *key, RyanJson_t item);
-    RyanJsonBool RyanJsonReplaceByIndex(RyanJson_t pJson, int32_t index, RyanJson_t item); // object对象也可以使用,但是不推荐
+// 这是change方法的补充,当需要修改value类型时,使用此函数
+// 请参考 changeJsonTest 示例,严格按照规则来使用
+extern RyanJsonBool_e RyanJsonReplaceByKey(RyanJson_t pJson, const char *key, RyanJson_t item);
+extern RyanJsonBool_e RyanJsonReplaceByIndex(RyanJson_t pJson, int32_t index, RyanJson_t item); // object对象也可以使用,但是不推荐
 
 #ifdef __cplusplus
 }

+ 0 - 299
RyanJsonExample/RFC8259JsonTest.c

@@ -1,299 +0,0 @@
-
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <dirent.h>
-// #include <intrin.h>
-
-#include "RyanJson.h"
-#include "cJSON.h"
-#include "yyjson.h"
-#include "valloc.h"
-
-#define PrintfStrCmpEnable
-
-typedef int (*jsonParseData)(char *file_name, char *data, uint32_t len);
-
-static void *yy_malloc(void *ctx, size_t size)
-{
-    return v_malloc(size);
-}
-static void *yy_realloc(void *ctx, void *ptr, size_t old_size, size_t size)
-{
-    return v_realloc(ptr, size);
-}
-static void yy_free(void *ctx, void *ptr)
-{
-    v_free(ptr);
-}
-
-static yyjson_alc yyalc = {
-    yy_malloc,
-    yy_realloc,
-    yy_free,
-    NULL};
-
-/* Read a file, parse, render back, etc. */
-int testFile(const char *path, jsonParseData jsonParseDataHandle)
-{
-
-    DIR *dir = NULL;
-    struct dirent *entry;
-
-    int path_len = strlen(path);
-    int count = 0;
-    int used_count = 0;
-    if (!path || !path_len || !(dir = opendir(path)))
-        goto fail;
-
-    while ((entry = readdir(dir)))
-    {
-
-        char *name = (char *)entry->d_name;
-
-        if (!name || !strlen(name))
-            continue;
-
-        if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
-            continue;
-
-        char aaa[300] = {0};
-        snprintf(aaa, sizeof(aaa), "%s/%s", path, name);
-
-        FILE *f = fopen(aaa, "rb");
-        if (f == NULL)
-            goto fail;
-
-        fseek(f, 0, SEEK_END);
-        long len = ftell(f);
-        fseek(f, 0, SEEK_SET);
-        char *data = (char *)malloc(len + 10);
-        fread(data, 1, len, f);
-        data[len] = '\0';
-        fclose(f);
-        int status = 0;
-
-        status = jsonParseDataHandle(name, data, len);
-
-        used_count++;
-        if (0 == strncmp("y_", name, 2))
-        {
-            if (0 == status)
-                count++;
-            else
-                printf("应该成功,但是失败: %s, len: %ld\n", data, len);
-        }
-        else if (0 == strncmp("n_", name, 2))
-        {
-            if (0 != status)
-                count++;
-            else
-                printf("应该失败,但是成功: %s, len: %ld\n", data, len);
-        }
-        else if (0 == strncmp("i_", name, 2))
-        {
-            count++;
-        }
-
-        int area = 0, use = 0;
-        v_mcheck(&area, &use);
-        if (use != (len + 10))
-        {
-            free(data);
-            printf("内存泄漏 %s len: %ld\r\n", data, len);
-            // printf("内存泄漏 %x len: %ld\r\n", (unsigned int)data, len);
-            // printf("内存泄漏 %c len: %ld\r\n", (int)data, len);
-            printf("|||----------->>> area = %d, size = %d\r\n", area, use);
-            break;
-        }
-        free(data);
-    }
-
-    closedir(dir);
-
-    printf("RFC 8259 JSON: (%d/%d)\r\n", count, used_count);
-    return 0;
-
-fail:
-    if (dir)
-        closedir(dir);
-
-    return -1;
-}
-
-/**
- * @brief RyanJson 测试程序
- *
- * @param file_name
- * @param data
- * @param len
- * @return int
- */
-int RyanJsonParseData(char *file_name, char *data, uint32_t len)
-{
-
-    if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
-        strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
-        strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
-        return -1;
-
-    RyanJson_t json = RyanJsonParseOptions(data, len, RyanJsonTrue, NULL);
-    if (NULL == json)
-        return -1;
-
-#ifdef PrintfStrCmpEnable
-    char *str = RyanJsonPrint(json, 60, RyanJsonFalse, NULL);
-    if (NULL == str)
-    {
-        printf("反序列化失败: [%s]\n", data);
-        goto err;
-    }
-
-    RyanJsonMinify(data);
-    if (0 != strcmp(data, str))
-        printf("数据不一致 -- 原始: %s -- 序列化: %s\n", data, str);
-
-    RyanJsonFree(str);
-#endif
-
-    RyanJsonDelete(json);
-    return 0;
-
-err:
-    RyanJsonDelete(json);
-    return -1;
-}
-
-/**
- * @brief cJson测试程序
- *
- * @param file_name
- * @param data
- * @param len
- * @return int
- */
-int cJSONParseData(char *file_name, char *data, uint32_t len)
-{
-
-    if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
-        strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
-        strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
-        return -1;
-
-    cJSON *json = cJSON_ParseWithLengthOpts(data, len + sizeof(""), NULL, RyanJsonTrue);
-    if (NULL == json)
-        return -1;
-
-#ifdef PrintfStrCmpEnable
-    char *str = cJSON_PrintBuffered(json, 60, RyanJsonFalse);
-    if (NULL == str)
-    {
-        printf("反序列化失败: [%s]\n", data);
-        goto err;
-    }
-
-    cJSON_Minify(data);
-    if (0 != strcmp(data, str))
-        printf("-- 原始: %s -- 序列化: %s\n", data, str);
-
-    cJSON_free(str);
-#endif
-
-    cJSON_Delete(json);
-    return 0;
-err:
-    cJSON_Delete(json);
-    return -1;
-}
-
-/**
- * @brief cJson测试程序
- *
- * @param file_name
- * @param data
- * @param len
- * @return int
- */
-int yyjsonParseData(char *file_name, char *data, uint32_t len)
-{
-
-    if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
-        strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
-        strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
-        return -1;
-
-    yyjson_doc *doc = yyjson_read_opts(data, len, YYJSON_READ_NOFLAG, &yyalc, NULL);
-    if (NULL == doc)
-        return -1;
-
-#ifdef PrintfStrCmpEnable
-    char *str = yyjson_write_opts(doc, YYJSON_WRITE_NOFLAG, &yyalc, NULL, NULL);
-    if (NULL == str)
-    {
-        printf("反序列化失败: [%s]\n", data);
-        goto err;
-    }
-
-    cJSON_Minify(data);
-    if (0 != strcmp(data, str))
-        printf("-- 原始: %s -- 序列化: %s\n", data, str);
-
-    free(str);
-#endif
-
-    yyjson_doc_free(doc);
-    return 0;
-err:
-    yyjson_doc_free(doc);
-    return -1;
-}
-
-// RFC 8259 JSON Test Suite
-// https://github.com/nst/JSONTestSuite
-int RFC8259JsonTest(void)
-{
-    int result = 0;
-    RyanJsonInitHooks(v_malloc, v_free, v_realloc);
-
-    cJSON_Hooks hooks = {
-        .malloc_fn = v_malloc,
-        .free_fn = v_free};
-    cJSON_InitHooks(&hooks);
-
-    printf("开始 RFC 8259 JSON 测试");
-
-    printf("\r\n--------------------------- RFC8259  RyanJson --------------------------\r\n");
-    result = testFile("./RyanJsonExample/RFC8259JsonData", RyanJsonParseData);
-    if (0 != result)
-    {
-        printf("%s:%d RyanJson RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    printf("\r\n--------------------------- RFC8259  cJSON --------------------------\r\n");
-    result = testFile("./RyanJsonExample/RFC8259JsonData", cJSONParseData);
-    if (0 != result)
-    {
-        printf("%s:%d cJSON RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    printf("\r\n--------------------------- RFC8259  yyjson --------------------------\r\n");
-    result = testFile("./RyanJsonExample/RFC8259JsonData", yyjsonParseData);
-    if (0 != result)
-    {
-        printf("%s:%d yyjson RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    displayMem();
-    return 0;
-
-err:
-    displayMem();
-    return -1;
-}

+ 0 - 191
RyanJsonExample/RyanJsonExample.c

@@ -1,191 +0,0 @@
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-
-#include "RyanJson.h"
-#include "valloc.h"
-
-/**
- * @brief 生成json示例
- *
- * @return int
- */
-int createJsonExample()
-{
-    char *str = NULL;
-    RyanJson_t jsonRoot, item;
-
-    // 对象生成测试
-    jsonRoot = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(jsonRoot, "inter", 16);
-    RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
-    RyanJsonAddStringToObject(jsonRoot, "string", "hello");
-    RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(jsonRoot, "null");
-
-    // 添加子对象
-    item = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(item, "inter", 16);
-    RyanJsonAddDoubleToObject(item, "double", 16.89);
-    RyanJsonAddStringToObject(item, "string", "hello");
-    RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(item, "null");
-    RyanJsonAddItemToObject(jsonRoot, "item", item); // 将上面创建的item子对象添加到root父对象
-
-    // 添加子数组
-    int arrayInt[] = {16, 16, 16, 16, 16};
-    RyanJsonAddItemToObject(jsonRoot, "arrayInt",
-                            RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
-
-    double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
-    RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
-                            RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
-
-    const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
-    RyanJsonAddItemToObject(jsonRoot, "arrayString",
-                            RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
-
-    RyanJson_t array = RyanJsonCreateArray();
-    RyanJsonAddIntToArray(array, 16);
-    RyanJsonAddDoubleToArray(array, 16.89);
-    RyanJsonAddStringToArray(array, "hello");
-    RyanJsonAddBoolToArray(array, RyanJsonTrue);
-    RyanJsonAddBoolToArray(array, RyanJsonFalse);
-    RyanJsonAddNullToArray(array);
-    RyanJsonAddItemToObject(jsonRoot, "array", array); // 将上面创建的item子对象数组添加到root父对象
-
-    // 添加对象数组
-    RyanJson_t arrayItem = RyanJsonCreateArray();
-    item = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(item, "inter", 16);
-    RyanJsonAddDoubleToObject(item, "double", 16.89);
-    RyanJsonAddStringToObject(item, "string", "hello");
-    RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(item, "null");
-    RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
-
-    item = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(item, "inter", 16);
-    RyanJsonAddDoubleToObject(item, "double", 16.89);
-    RyanJsonAddStringToObject(item, "string", "hello");
-    RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(item, "null");
-    RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
-
-    RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem); // 将arrayItem数组添加到root父对象
-
-    uint32_t len = 0;
-    str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len); // 以带格式方式将数据打印出来
-    printf("strLen: %d, data: %s\r\n", len, str);
-    RyanJsonFree(str);
-
-    RyanJsonDelete(jsonRoot);
-
-    return 0;
-}
-
-/**
- * @brief 序列化json文本示例
- *
- * @return int
- */
-int loadJsonExample()
-{
-    char *str = NULL;
-    RyanJson_t jsonRoot;
-    const char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-
-    // 解析json数据
-    jsonRoot = RyanJsonParse(jsonstr);
-    if (jsonRoot == NULL)
-    {
-        printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // 将序列化的数据以无格式样式打印出来,并和原始数据进行对比
-    str = RyanJsonPrint(jsonRoot, 250, RyanJsonFalse, NULL);
-    if (strcmp(str, jsonstr) != 0)
-    {
-        printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
-        RyanJsonFree(str);
-        RyanJsonDelete(jsonRoot);
-        return -1;
-    }
-    RyanJsonFree(str);
-
-    // 将序列化的数据以有格式样式打印出来
-    uint32_t len = 0;
-    str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
-    printf("strLen: %d, data: %s\r\n", len, str);
-    RyanJsonFree(str);
-
-    // 删除json对象
-    RyanJsonDelete(jsonRoot);
-
-    return 0;
-}
-
-/**
- * @brief 修改json示例
- *
- * @return int
- */
-int changeJsonExample()
-{
-    char *str = NULL;
-    RyanJson_t jsonRoot;
-    const char *jsonstr = "{\"name\":\"Mash\",\"star\":4,\"hits\":[2,2,1,3]}";
-
-    // 解析json数据
-    jsonRoot = RyanJsonParse(jsonstr);
-    if (jsonRoot == NULL)
-    {
-        printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    RyanJsonChangeStringValue(RyanJsonGetObjectByKey(jsonRoot, "name"), "Ryan");
-    if (0 != strcmp("Ryan", RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "name"))))
-    {
-        printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
-        RyanJsonDelete(jsonRoot);
-        return -1;
-    }
-
-    RyanJsonReplaceByKey(jsonRoot, "star", RyanJsonCreateString("", "123456"));
-
-    // 将序列化的数据以有格式样式打印出来
-    uint32_t len = 0;
-    str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
-    printf("strLen: %d, data: %s\r\n", len, str);
-    RyanJsonFree(str);
-
-    // 删除json对象
-    RyanJsonDelete(jsonRoot);
-
-    return 0;
-}
-
-int RyanJsonExample(void)
-{
-    RyanJsonInitHooks(v_malloc, v_free, v_realloc);
-
-    printf("\r\n--------------------------- RyanJson 生成示例 --------------------------\r\n");
-    createJsonExample();
-
-    printf("\r\n--------------------------- RyanJson 序列化json文本示例 --------------------------\r\n");
-    loadJsonExample();
-
-    printf("\r\n--------------------------- RyanJson 修改json示例 --------------------------\r\n");
-    changeJsonExample();
-
-    return -1;
-}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 106
RyanJsonExample/RyanJsonMemoryFootprintTest.c


+ 0 - 1144
RyanJsonExample/RyanJsonTest.c

@@ -1,1144 +0,0 @@
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <math.h>
-#include <time.h>
-
-#include "RyanJson.h"
-#include "cJSON.h"
-#include "valloc.h"
-
-/* --------------------------------------- jsonTest ------------------------------------------- */
-// !(fabs(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")) - 16.89) < 1e-6)
-static RyanJsonBool compare_double(double a, double b)
-{
-    double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
-    return (fabs(a - b) <= maxVal * DBL_EPSILON);
-}
-
-static int rootNodeCheckTest(RyanJson_t json)
-{
-    if (!RyanJsonIsInt(RyanJsonGetObjectToKey(json, "inter")) || 16 != RyanJsonGetIntValue(RyanJsonGetObjectToKey(json, "inter")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsDouble(RyanJsonGetObjectToKey(json, "double")) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")), 16.89))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "string")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "string")), "hello"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolTrue")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolTrue")) != RyanJsonTrue)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolFalse")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolFalse")) != RyanJsonFalse)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsNull(RyanJsonGetObjectToKey(json, "null")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int itemNodeCheckTest(RyanJson_t json)
-{
-    RyanJson_t item = RyanJsonGetObjectToKey(json, "item");
-    if (0 != rootNodeCheckTest(item))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int arrayNodeCheckTest(RyanJson_t json)
-{
-    RyanJson_t item = NULL;
-
-    // 判断是不是数组类型
-    if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayInt")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayDouble")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayString")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "array")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    /**
-     * @brief 检查弱类型数组
-     *
-     */
-    //   array: [16, 16.89, "hello", true, false, null],
-    if (!RyanJsonIsInt(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 0)) || 16 != RyanJsonGetIntValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 0)))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsDouble(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)), 16.89))
-    {
-        printf("%s:%d 解析失败 %f\r\n", __FILE__, __LINE__, RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 1)));
-        return -1;
-    }
-
-    if (!RyanJsonIsString(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 2)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 2)), "hello"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsBool(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 3)) || RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 3)) != RyanJsonTrue)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsBool(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 4)) || RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 4)) != RyanJsonFalse)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (!RyanJsonIsNull(RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "array"), 5)))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    /**
-     * @brief 检查强类型数组
-     *
-     */
-    for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayInt")); count++)
-    {
-        item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), count);
-        if (!RyanJsonIsInt(item) || 16 != RyanJsonGetIntValue(item))
-        {
-            printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-            return -1;
-        }
-    }
-
-    for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayDouble")); count++)
-    {
-        item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayDouble"), count);
-        if (!RyanJsonIsDouble(item) || fabs(RyanJsonGetDoubleValue(item) - 16.8) < 0.001)
-        {
-            printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-            return -1;
-        }
-    }
-
-    for (uint8_t count = 0; count < RyanJsonGetSize(RyanJsonGetObjectToKey(json, "arrayString")); count++)
-    {
-        item = RyanJsonGetObjectByIndex(RyanJsonGetObjectToKey(json, "arrayString"), count);
-        if (!RyanJsonIsString(item) || strcmp(RyanJsonGetStringValue(item), "hello"))
-        {
-            printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-            return -1;
-        }
-    }
-
-    if (6 != RyanJsonGetSize(RyanJsonGetObjectToKey(json, "array")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int arrayItemNodeCheckTest(RyanJson_t json)
-{
-    if (!RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayItem")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != rootNodeCheckTest(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != rootNodeCheckTest(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 1)))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-    return 0;
-}
-
-/* --------------------------------------------------------------------- */
-
-int loadJsonTest()
-{
-    char *str = NULL;
-    RyanJson_t json;
-    char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-
-    json = RyanJsonParse(jsonstr);
-    if (json == NULL)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    str = RyanJsonPrint(json, 250, RyanJsonFalse, NULL);
-    if (strcmp(str, jsonstr) != 0)
-    {
-        printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
-        RyanJsonFree(str);
-        RyanJsonDelete(json);
-        return -1;
-    }
-
-    RyanJsonFree(str);
-
-    if (0 != rootNodeCheckTest(json))
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d rootNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != itemNodeCheckTest(json))
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d itemNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != arrayNodeCheckTest(json))
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d arrayNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != arrayItemNodeCheckTest(json))
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d arrayItemNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-    RyanJsonDelete(json);
-
-    /**
-     * @brief 测试序列化错误json结构
-     *
-     */
-    // \"inter\":16poi,  无效数字
-    json = RyanJsonParse("{\"inter\":16poi,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"double\":16.8yu9,,  无效浮点数
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.8yu9,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // boolTrue 设置为 tru
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":tru,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // boolFalse 设置为 fale
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":fale,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // null 设置为 nul
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":nul,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // null 设置为 NULL
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":NULL,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"inter\":16后面少个,
-    json = RyanJsonParse("{\"inter\":16\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // array数组项少一个,
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"item:{\"inter\":16,\"  少一个"
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item:{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"item\":{\"inter\":16,double\"  少一个"
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"item\":{\"inter\":16,\"\"double\"  多一个"
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"item\":{\"inter\":16\",\"double\"  多一个"
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16\",\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    // \"arrayInt\":[16,16,16m,16,16]  无效数组数字
-    json = RyanJsonParse("{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16m,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}");
-    if (json != NULL)
-    {
-        RyanJsonDelete(json);
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-    return 0;
-}
-
-int createJsonTest()
-{
-    RyanJson_t jsonRoot, item;
-
-    // 对象生成测试
-    jsonRoot = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(jsonRoot, "inter", 16);
-    RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
-    RyanJsonAddStringToObject(jsonRoot, "string", "hello");
-    RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(jsonRoot, "null");
-
-    /**
-     * @brief 对象添加测试
-     *
-     */
-    item = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(item, "inter", 16);
-    RyanJsonAddDoubleToObject(item, "double", 16.89);
-    RyanJsonAddStringToObject(item, "string", "hello");
-    RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(item, "null");
-    RyanJsonAddItemToObject(jsonRoot, "item", item);
-
-    /**
-     * @brief 数组添加测试
-     *
-     */
-    int arrayInt[] = {16, 16, 16, 16, 16};
-    RyanJsonAddItemToObject(jsonRoot, "arrayInt",
-                            RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
-
-    double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
-    RyanJsonAddItemToObject(jsonRoot, "arrayDouble",
-                            RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
-
-    const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
-    RyanJsonAddItemToObject(jsonRoot, "arrayString",
-                            RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
-
-    RyanJson_t array = RyanJsonCreateArray();
-    RyanJsonAddIntToArray(array, 16);
-    RyanJsonAddDoubleToArray(array, 16.89);
-    RyanJsonAddStringToArray(array, "hello");
-    RyanJsonAddBoolToArray(array, RyanJsonTrue);
-    RyanJsonAddBoolToArray(array, RyanJsonFalse);
-    RyanJsonAddNullToArray(array);
-    RyanJsonAddItemToObject(jsonRoot, "array", array);
-
-    /**
-     * @brief 对象数组测试
-     *
-     */
-    RyanJson_t arrayItem = RyanJsonCreateArray();
-    item = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(item, "inter", 16);
-    RyanJsonAddDoubleToObject(item, "double", 16.89);
-    RyanJsonAddStringToObject(item, "string", "hello");
-    RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(item, "null");
-    RyanJsonAddItemToObject(arrayItem, "item", item);
-
-    item = RyanJsonCreateObject();
-    RyanJsonAddIntToObject(item, "inter", 16);
-    RyanJsonAddDoubleToObject(item, "double", 16.89);
-    RyanJsonAddStringToObject(item, "string", "hello");
-    RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
-    RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
-    RyanJsonAddNullToObject(item, "null");
-    RyanJsonAddItemToObject(arrayItem, "item", item);
-
-    RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem);
-
-    if (0 != rootNodeCheckTest(jsonRoot))
-    {
-        RyanJsonDelete(jsonRoot);
-        printf("%s:%d rootNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != itemNodeCheckTest(jsonRoot))
-    {
-        RyanJsonDelete(jsonRoot);
-        printf("%s:%d itemNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != arrayNodeCheckTest(jsonRoot))
-    {
-        RyanJsonDelete(jsonRoot);
-        printf("%s:%d arrayNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    if (0 != arrayItemNodeCheckTest(jsonRoot))
-    {
-        RyanJsonDelete(jsonRoot);
-        printf("%s:%d arrayItemNodeCheckTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-    RyanJsonDelete(jsonRoot);
-
-    return 0;
-}
-
-int changeJsonTest()
-{
-
-    char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-
-    RyanJson_t json = RyanJsonParse(jsonstr);
-    if (json == NULL)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    /**
-     * @brief 修改对应类型
-     *
-     */
-    RyanJsonChangeIntValue(RyanJsonGetObjectToKey(json, "inter"), 20);
-    if (!RyanJsonIsInt(RyanJsonGetObjectToKey(json, "inter")) || 20 != RyanJsonGetIntValue(RyanJsonGetObjectToKey(json, "inter")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonChangeDoubleValue(RyanJsonGetObjectToKey(json, "double"), 20.89);
-    if (!RyanJsonIsDouble(RyanJsonGetObjectToKey(json, "double")) || !compare_double(RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(json, "double")), 20.89))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonChangeStringValue(RyanJsonGetObjectToKey(json, "string"), "world");
-    if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "string")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "string")), "world"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json, "boolTrue"), RyanJsonFalse);
-    if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolTrue")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolTrue")) != RyanJsonFalse)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json, "boolFalse"), RyanJsonTrue);
-    if (!RyanJsonIsBool(RyanJsonGetObjectToKey(json, "boolFalse")) || RyanJsonGetBoolValue(RyanJsonGetObjectToKey(json, "boolFalse")) != RyanJsonTrue)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    /* ---------------------------------- replace使用 -------------------------------------*/
-    // 数组没有key, replace的子项不能有key, 函数内部没有做逻辑判断,会造成内存泄漏
-    RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0, RyanJsonCreateString(NULL, "arrayInt"));
-    if (!RyanJsonIsString(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayInt"), 0)), "arrayInt"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonReplaceByIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0, RyanJsonCreateString(NULL, "arrayItem"));
-    if (!RyanJsonIsString(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json, "arrayItem"), 0)), "arrayItem"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    // 对象必须包含key, 如果创建的对象key为null会引起内存错误
-    RyanJsonReplaceByKey(json, "arrayString", RyanJsonCreateString("", "arrayString"));
-    if (!RyanJsonIsString(RyanJsonGetObjectToKey(json, "arrayString")) || strcmp(RyanJsonGetStringValue(RyanJsonGetObjectToKey(json, "arrayString")), "arrayString"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    // 修改数组节点为对象节点
-    RyanJsonReplaceByKey(json, "arrayDouble", RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item")));
-    if (!RyanJsonIsObject(RyanJsonGetObjectToKey(json, "arrayDouble")) || -1 == rootNodeCheckTest(RyanJsonGetObjectToKey(json, "arrayDouble")))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-
-        goto err;
-    }
-
-    /**
-     * @brief 对象子项删除测试
-     *
-     */
-    RyanJsonDeleteByIndex(json, 0);
-    if (RyanJsonGetObjectToKey(json, "inter"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDeleteByKey(json, "double");
-    if (RyanJsonGetObjectToKey(json, "double"))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    /**
-     * @brief 数组对象子项删除测试
-     *
-     */
-    RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json, "array"), 0);
-    if (RyanJsonGetSize(RyanJsonGetObjectToKey(json, "array")) != 5)
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    // str = RyanJsonPrint(json, 1024, RyanJsonTrue, NULL);
-    // printf("aa %s\r\n", str);
-    // RyanJsonFree(str);
-    RyanJsonDelete(json);
-    return 0;
-
-err:
-    RyanJsonDelete(json);
-    return -1;
-}
-
-int compareJsonTest()
-{
-    char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-    // char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}";
-
-    RyanJson_t json = RyanJsonParse(jsonstr);
-    RyanJson_t json2 = RyanJsonParse(jsonstr);
-
-    // 比较函数
-    if (RyanJsonTrue != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddStringToObject(json2, "test", "hello");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddIntToObject(json2, "test", 1);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddDoubleToObject(json2, "test", 2.0);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddBoolToObject(json2, "test", RyanJsonTrue);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddNullToObject(json2, "test");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddIntToArray(RyanJsonGetObjectToKey(json2, "arrayInt"), 2);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddDoubleToArray(RyanJsonGetObjectToKey(json2, "arrayDouble"), 2.0);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddStringToArray(RyanJsonGetObjectToKey(json2, "arrayString"), "hello");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonAddItemToArray(RyanJsonGetObjectToKey(json2, "arrayItem"), RyanJsonCreateString("test", "hello"));
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeKey(RyanJsonGetObjectToKey(json2, "inter"), "int2");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeIntValue(RyanJsonGetObjectToKey(json2, "inter"), 17);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeDoubleValue(RyanJsonGetObjectToKey(json2, "double"), 20.89);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeStringValue(RyanJsonGetObjectToKey(json2, "string"), "49");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json2, "boolTrue"), RyanJsonFalse);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeBoolValue(RyanJsonGetObjectToKey(json2, "item", "boolTrue"), RyanJsonFalse);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeIntValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayInt"), 0), 17);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeDoubleValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayDouble"), 0), 20.89);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeStringValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayString"), 0), "20.89");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeIntValue(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "array"), 0), 17);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonChangeIntValue(RyanJsonGetObjectToKey(RyanJsonGetObjectToIndex(RyanJsonGetObjectToKey(json2, "arrayItem"), 0), "inter"), 17);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonDeleteByKey(json2, "arrayItem");
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json2, "arrayInt"), 2);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json2);
-    json2 = RyanJsonParse(jsonstr);
-    RyanJsonDeleteByIndex(RyanJsonGetObjectToKey(json2, "arrayItem"), 0);
-    if (RyanJsonFalse != RyanJsonCompare(json, json2))
-    {
-        printf("%s:%d 解析失败\r\n", __FILE__, __LINE__);
-        goto err;
-    }
-
-    RyanJsonDelete(json);
-    RyanJsonDelete(json2);
-    return 0;
-
-err:
-    RyanJsonDelete(json);
-    RyanJsonDelete(json2);
-    return -1;
-}
-
-int duplicateTest()
-{
-    RyanJson_t json, dupItem, jsonRoot = NULL;
-    char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-
-    /**
-     * @brief 普通类型
-     *
-     */
-    json = RyanJsonParse(jsonstr);
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
-    if (RyanJsonFalse == RyanJsonCompare(dupItem, RyanJsonGetObjectToKey(json, "inter")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(dupItem);
-
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test", "inter"), RyanJsonGetObjectToKey(json, "inter")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
-
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test", "inter"), RyanJsonGetObjectToKey(json, "inter")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(json);
-
-    json = RyanJsonParse(jsonstr);
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "inter"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test", "inter"), RyanJsonGetObjectToKey(json, "inter")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
-    RyanJsonDelete(json);
-
-    /**
-     * @brief 对象类型
-     *
-     */
-    json = RyanJsonParse(jsonstr);
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
-    if (RyanJsonFalse == RyanJsonCompare(dupItem, RyanJsonGetObjectToKey(json, "item")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(dupItem);
-
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "item")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
-
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "item")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(json);
-
-    json = RyanJsonParse(jsonstr);
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "item")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
-    RyanJsonDelete(json);
-
-    /**
-     * @brief 数组类型
-     *
-     */
-    json = RyanJsonParse(jsonstr);
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
-    if (RyanJsonFalse == RyanJsonCompare(dupItem, RyanJsonGetObjectToKey(json, "arrayItem")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(dupItem);
-
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "arrayItem")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
-
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "arrayItem")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(json);
-
-    json = RyanJsonParse(jsonstr);
-    dupItem = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "arrayItem"));
-    RyanJsonAddItemToObject(json, "test", dupItem);
-    if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "test"), RyanJsonGetObjectToKey(json, "arrayItem")))
-    {
-        goto err;
-    }
-    RyanJsonDelete(RyanJsonDetachByKey(json, "test"));
-    RyanJsonDelete(json);
-
-    json = RyanJsonParse(jsonstr);
-    jsonRoot = RyanJsonCreateObject();
-    RyanJsonAddBoolToObject(jsonRoot, "arrayItem", RyanJsonTrue);
-    int use = 0;
-    for (uint8_t i = 0; i < 10; i++)
-    {
-        dupItem = RyanJsonParse(jsonstr);
-        RyanJsonReplaceByKey(jsonRoot, "arrayItem", RyanJsonDuplicate(dupItem));
-        if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(jsonRoot, "arrayItem"), dupItem))
-        {
-            goto err;
-        }
-        RyanJsonReplaceByKey(json, "arrayItem", RyanJsonDuplicate(RyanJsonGetObjectByKey(dupItem, "item")));
-        if (RyanJsonFalse == RyanJsonCompare(RyanJsonGetObjectToKey(json, "arrayItem"), RyanJsonGetObjectByKey(dupItem, "item")))
-        {
-            goto err;
-        }
-        RyanJsonDelete(dupItem);
-
-        int newuse = 0;
-        v_mcheck(NULL, &newuse);
-        if (i != 0 && newuse != use)
-        {
-            printf("%s:%d 内存泄漏\r\n", __FILE__, __LINE__);
-            goto err;
-        }
-        use = newuse;
-    }
-
-    RyanJsonDelete(json);
-    RyanJsonDelete(jsonRoot);
-    return 0;
-
-err:
-    RyanJsonDelete(json);
-    RyanJsonDelete(jsonRoot);
-    return -1;
-}
-
-int likeReferenceTest()
-{
-
-    // char *str = NULL;
-    // char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-    // RyanJson_t json = RyanJsonParse(jsonstr);
-    // RyanJson_t item = NULL;
-
-    // // RyanJson_t adfasdf = RyanJsonDuplicate(RyanJsonGetObjectToKey(json, "item"));
-
-    // // RyanJsonAddItemToObject(json, "test", adfasdf);
-
-    // // 这里做你想做的事,这里我选择打印出来
-    // // str = RyanJsonPrint(json, 50, RyanJsonTrue, NULL);
-    // // printf("item %s \r\n", str);
-    // // RyanJsonFree(str);
-
-    // for (int i = 0; i < 1; i++)
-    // {
-    //     // 分离test对象
-    //     item = RyanJsonDetachByKey(json, "item");
-
-    //     // if (RyanJsonIsKey(item))
-    //     //     RyanJsonFree(RyanJsonGetKey(item));
-
-    //     // RyanJsonFree(item);
-    // }
-
-    // RyanJsonAddItemToObject(json, "item", item);
-
-    // str = RyanJsonPrint(json, 50, RyanJsonTrue, NULL);
-    // printf("item %s \r\n", str);
-    // RyanJsonFree(str);
-
-    // RyanJsonDelete(json);
-
-    return 0;
-}
-
-int forEachTest()
-{
-    char *str = NULL;
-    char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
-
-    RyanJson_t json = RyanJsonParse(jsonstr);
-    RyanJson_t item = NULL;
-    printf("arrayDouble: ");
-    RyanJsonArrayForEach(RyanJsonGetObjectToKey(json, "arrayDouble"), item)
-    {
-        if (!RyanJsonIsDouble(item) || 16.89 != RyanJsonGetDoubleValue(item))
-        {
-            goto err;
-        }
-    }
-
-    RyanJsonArrayForEach(RyanJsonGetObjectToKey(json, "arrayInt"), item)
-    {
-        if (!RyanJsonIsInt(item) || 16 != RyanJsonGetIntValue(item))
-        {
-            goto err;
-        }
-    }
-
-    uint32_t strLen;
-    RyanJsonObjectForEach(RyanJsonGetObjectToKey(json, "item"), item)
-    {
-        str = RyanJsonPrint(item, 50, RyanJsonTrue, &strLen);
-        printf("item { %s : %s }  %d\r\n", RyanJsonGetKey(item), str, strLen);
-        RyanJsonFree(str);
-    }
-
-    RyanJsonDelete(json);
-    return 0;
-
-err:
-    RyanJsonDelete(json);
-    return -1;
-}
-
-int RyanJsonTest(void)
-{
-    int result = 0;
-    RyanJsonInitHooks(v_malloc, v_free, v_realloc);
-
-    result = loadJsonTest(); // 从文本解析json测试
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    result = createJsonTest(); // 生成json节点树测试
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    result = changeJsonTest(); // 修改json节点测试,包含删除、分离
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    result = compareJsonTest(); // 比较json节点树测试
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    result = duplicateTest(); // 复制测试
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    result = forEachTest();
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    result = likeReferenceTest(); // 模仿 引用类型实现 示例
-    if (0 != result)
-    {
-        printf("%s:%d loadJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    displayMem();
-
-    return 0;
-}

+ 0 - 48
RyanJsonExample/main.c

@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include "RyanJson.h"
-#include "valloc.h"
-
-void printfTitle(char *title)
-{
-    printf("\r\n");
-    printf("\r\n");
-    printf("*****************************************************************************\r\n");
-    printf("*************************** %s **************************\r\n", title);
-    printf("*****************************************************************************\r\n");
-}
-
-extern int RyanJsonExample();
-extern int RyanJsonTest();
-extern int RyanJsonMemoryFootprintTest();
-extern int RFC8259JsonTest();
-
-int main(void)
-{
-    int result = 0;
-    printfTitle("RyanJson 示例程序");
-    RyanJsonExample();
-
-    printfTitle("RyanJson 接口测试程序");
-    result = RyanJsonTest();
-    if (0 != result)
-    {
-        printf("%s:%d RyanJsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    printfTitle("RyanJson / cJSON / yyjson RFC8259标准测试");
-    result = RFC8259JsonTest();
-    if (0 != result)
-    {
-        printf("%s:%d RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
-        return -1;
-    }
-
-    printfTitle("RyanJson / cJSON / yyjson 内存对比程序");
-    result = RyanJsonMemoryFootprintTest();
-
-    displayMem();
-    return 0;
-}

+ 0 - 81
RyanJsonExample/valloc/valloc.c

@@ -1,81 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-static int count = 0;
-static int use = 0;
-
-void *v_malloc(size_t size)
-{
-    void *p;
-    p = malloc(size ? size + sizeof(int) : 0);
-    if (!p)
-        return NULL;
-    count++;
-    *(int *)p = size;
-    use += size;
-    return (void *)((char *)p + sizeof(int));
-}
-
-void *v_calloc(size_t num, size_t size)
-{
-    void *p;
-    p = v_malloc(num * size);
-    if (!p)
-        return NULL;
-    memset(p, 0, num * size);
-    return p;
-}
-
-void v_free(void *block)
-{
-    void *p;
-    if (!block)
-        return;
-    p = (void *)((char *)block - sizeof(int));
-    use -= *(int *)p;
-    count--;
-    free(p);
-}
-
-void *v_realloc(void *block, size_t size)
-{
-    void *p;
-    int s = 0;
-    if (block)
-    {
-        block = (void *)((char *)block - sizeof(int));
-        s = *(int *)block;
-    }
-    p = realloc(block, size ? size + sizeof(int) : 0);
-    if (!p)
-        return NULL;
-    if (!block)
-        count++;
-    *(int *)p = size;
-    use += (size - s);
-    return (void *)((char *)p + sizeof(int));
-}
-
-int v_mcheck(int *_count, int *_use)
-{
-    if (_count)
-        *_count = count;
-    if (_use)
-        *_use = use;
-
-    // if (count || use)
-    // {
-    // 	printf("|||----------->>> area = %d, size = %d\r\n", count, use);
-    // 	return 1;
-    // }
-
-    return 0;
-}
-
-void displayMem()
-{
-    int area = 0, use = 0;
-    v_mcheck(&area, &use);
-    printf("|||----------->>> area = %d, size = %d\r\n", area, use);
-}

+ 191 - 0
example/RyanJsonExample.c

@@ -0,0 +1,191 @@
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+
+#include "RyanJson.h"
+#include "valloc.h"
+
+/**
+ * @brief 生成json示例
+ *
+ * @return int
+ */
+static int createJsonExample(void)
+{
+	char *str = NULL;
+	RyanJson_t jsonRoot, item;
+
+	// 对象生成测试
+	jsonRoot = RyanJsonCreateObject();
+	RyanJsonAddIntToObject(jsonRoot, "inter", 16);
+	RyanJsonAddDoubleToObject(jsonRoot, "double", 16.89);
+	RyanJsonAddStringToObject(jsonRoot, "string", "hello");
+	RyanJsonAddBoolToObject(jsonRoot, "boolTrue", RyanJsonTrue);
+	RyanJsonAddBoolToObject(jsonRoot, "boolFalse", RyanJsonFalse);
+	RyanJsonAddNullToObject(jsonRoot, "null");
+
+	// 添加子对象
+	item = RyanJsonCreateObject();
+	RyanJsonAddIntToObject(item, "inter", 16);
+	RyanJsonAddDoubleToObject(item, "double", 16.89);
+	RyanJsonAddStringToObject(item, "string", "hello");
+	RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
+	RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
+	RyanJsonAddNullToObject(item, "null");
+	RyanJsonAddItemToObject(jsonRoot, "item", item); // 将上面创建的item子对象添加到root父对象
+
+	// 添加子数组
+	int arrayInt[] = {16, 16, 16, 16, 16};
+	RyanJsonAddItemToObject(jsonRoot, "arrayInt", RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
+
+	double arrayDouble[] = {16.89, 16.89, 16.89, 16.89, 16.89};
+	RyanJsonAddItemToObject(jsonRoot, "arrayDouble", RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
+
+	const char *arrayString[] = {"hello", "hello", "hello", "hello", "hello"};
+	RyanJsonAddItemToObject(jsonRoot, "arrayString", RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
+
+	RyanJson_t array = RyanJsonCreateArray();
+	RyanJsonAddIntToArray(array, 16);
+	RyanJsonAddDoubleToArray(array, 16.89);
+	RyanJsonAddStringToArray(array, "hello");
+	RyanJsonAddBoolToArray(array, RyanJsonTrue);
+	RyanJsonAddBoolToArray(array, RyanJsonFalse);
+	RyanJsonAddNullToArray(array);
+	RyanJsonAddItemToObject(jsonRoot, "array", array); // 将上面创建的item子对象数组添加到root父对象
+
+	// 添加对象数组
+	RyanJson_t arrayItem = RyanJsonCreateArray();
+	item = RyanJsonCreateObject();
+	RyanJsonAddIntToObject(item, "inter", 16);
+	RyanJsonAddDoubleToObject(item, "double", 16.89);
+	RyanJsonAddStringToObject(item, "string", "hello");
+	RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
+	RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
+	RyanJsonAddNullToObject(item, "null");
+	RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
+
+	item = RyanJsonCreateObject();
+	RyanJsonAddIntToObject(item, "inter", 16);
+	RyanJsonAddDoubleToObject(item, "double", 16.89);
+	RyanJsonAddStringToObject(item, "string", "hello");
+	RyanJsonAddBoolToObject(item, "boolTrue", RyanJsonTrue);
+	RyanJsonAddBoolToObject(item, "boolFalse", RyanJsonFalse);
+	RyanJsonAddNullToObject(item, "null");
+	RyanJsonAddItemToObject(arrayItem, "item", item); // 将item对象添加到arrayItem数组里面
+
+	RyanJsonAddItemToObject(jsonRoot, "arrayItem", arrayItem); // 将arrayItem数组添加到root父对象
+
+	uint32_t len = 0;
+	str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len); // 以带格式方式将数据打印出来
+	printf("strLen: %d, data: %s\r\n", len, str);
+	RyanJsonFree(str);
+
+	RyanJsonDelete(jsonRoot);
+
+	return 0;
+}
+
+/**
+ * @brief 序列化json文本示例
+ *
+ * @return int
+ */
+static int loadJsonExample(void)
+{
+	char *str = NULL;
+	RyanJson_t jsonRoot;
+	const char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
+			       "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,16.89,16.89,16.89],\"arrayString\":[\"hello\","
+			       "\"hello\",\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,\"double\":16.89,\"string\":\"hello\","
+			       "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null}]}";
+
+	// 解析json数据
+	jsonRoot = RyanJsonParse(jsonstr);
+	if (jsonRoot == NULL)
+	{
+		printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
+		return -1;
+	}
+
+	// 将序列化的数据以无格式样式打印出来,并和原始数据进行对比
+	str = RyanJsonPrint(jsonRoot, 250, RyanJsonFalse, NULL);
+	if (strcmp(str, jsonstr) != 0)
+	{
+		printf("%s:%d 序列化与反序列化后的数据不对应\r\n", __FILE__, __LINE__);
+		RyanJsonFree(str);
+		RyanJsonDelete(jsonRoot);
+		return -1;
+	}
+	RyanJsonFree(str);
+
+	// 将序列化的数据以有格式样式打印出来
+	uint32_t len = 0;
+	str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
+	printf("strLen: %d, data: %s\r\n", len, str);
+	RyanJsonFree(str);
+
+	// 删除json对象
+	RyanJsonDelete(jsonRoot);
+
+	return 0;
+}
+
+/**
+ * @brief 修改json示例
+ *
+ * @return int
+ */
+static int changeJsonExample(void)
+{
+	char *str = NULL;
+	RyanJson_t jsonRoot;
+	const char *jsonstr = "{\"name\":\"Mash\",\"star\":4,\"hits\":[2,2,1,3]}";
+
+	// 解析json数据
+	jsonRoot = RyanJsonParse(jsonstr);
+	if (jsonRoot == NULL)
+	{
+		printf("%s:%d 序列化失败\r\n", __FILE__, __LINE__);
+		return -1;
+	}
+
+	RyanJsonChangeStringValue(RyanJsonGetObjectByKey(jsonRoot, "name"), "Ryan");
+	if (0 != strcmp("Ryan", RyanJsonGetStringValue(RyanJsonGetObjectByKey(jsonRoot, "name"))))
+	{
+		printf("%s:%d 修改失败\r\n", __FILE__, __LINE__);
+		RyanJsonDelete(jsonRoot);
+		return -1;
+	}
+
+	RyanJsonReplaceByKey(jsonRoot, "star", RyanJsonCreateString("", "123456"));
+
+	// 将序列化的数据以有格式样式打印出来
+	uint32_t len = 0;
+	str = RyanJsonPrint(jsonRoot, 250, RyanJsonTrue, &len);
+	printf("strLen: %d, data: %s\r\n", len, str);
+	RyanJsonFree(str);
+
+	// 删除json对象
+	RyanJsonDelete(jsonRoot);
+
+	return 0;
+}
+
+int RyanJsonExample(void)
+{
+	RyanJsonInitHooks(v_malloc, v_free, v_realloc);
+
+	printf("\r\n--------------------------- RyanJson 生成示例 --------------------------\r\n");
+	createJsonExample();
+
+	printf("\r\n--------------------------- RyanJson 序列化json文本示例 --------------------------\r\n");
+	loadJsonExample();
+
+	printf("\r\n--------------------------- RyanJson 修改json示例 --------------------------\r\n");
+	changeJsonExample();
+
+	return -1;
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 261 - 228
externalModule/cJSON/cJSON.c


+ 17 - 16
cJSON/cJSON.h → externalModule/cJSON/cJSON.h

@@ -81,13 +81,10 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ
 /* project version */
 #define CJSON_VERSION_MAJOR 1
 #define CJSON_VERSION_MINOR 7
-#define CJSON_VERSION_PATCH 15
+#define CJSON_VERSION_PATCH 18
 
 #include <stddef.h>
 
-#define rt_memset memset
-#define rt_memcpy memcpy
-
 /* cJSON Types: */
 #define cJSON_Invalid (0)
 #define cJSON_False  (1 << 0)
@@ -101,13 +98,7 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ
 
 #define cJSON_IsReference 256
 #define cJSON_StringIsConst 512
-    union value
-    {
-    /* writing to value.valueint is DEPRECATED, use cJSON_SetNumberValue instead */
-    int valueint;
-    /* The item's number, if type==cJSON_Number */
-    double valuedouble;
-    };
+
 /* The cJSON structure: */
 typedef struct cJSON
 {
@@ -122,7 +113,11 @@ typedef struct cJSON
 
     /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
     char *valuestring;
-    union value value;
+    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
+    int valueint;
+    /* The item's number, if type==cJSON_Number */
+    double valuedouble;
+
     /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
     char *string;
 } cJSON;
@@ -142,6 +137,12 @@ typedef int cJSON_bool;
 #define CJSON_NESTING_LIMIT 1000
 #endif
 
+/* Limits the length of circular references can be before cJSON rejects to parse them.
+ * This is to prevent stack overflows. */
+#ifndef CJSON_CIRCULAR_LIMIT
+#define CJSON_CIRCULAR_LIMIT 10000
+#endif
+
 /* returns the version of cJSON as a string */
 CJSON_PUBLIC(const char*) cJSON_Version(void);
 
@@ -260,7 +261,7 @@ CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
 CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
 
 /* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
- * The input pointer json cannot point to a read-only address area, such as a string constant,
+ * The input pointer json cannot point to a read-only address area, such as a string constant, 
  * but should point to a readable and writable address area. */
 CJSON_PUBLIC(void) cJSON_Minify(char *json);
 
@@ -276,8 +277,8 @@ CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * con
 CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
 CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
 
-/* When assigning an integer value, it needs to be propagated to value.valuedouble too. */
-#define cJSON_SetIntValue(object, number) ((object) ? (object)->value.valueint = (object)->value.valuedouble = (number) : (number))
+/* When assigning an integer value, it needs to be propagated to valuedouble too. */
+#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
 /* helper for the cJSON_SetNumberValue macro */
 CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
 #define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
@@ -302,4 +303,4 @@ CJSON_PUBLIC(void) cJSON_free(void *object);
 }
 #endif
 
-#endif
+#endif

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 650 - 2046
externalModule/yyjson/yyjson.c


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 330 - 186
externalModule/yyjson/yyjson.h


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_double_huge_neg_exp.json → test/RFC8259JsonData/i_number_double_huge_neg_exp.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_huge_exp.json → test/RFC8259JsonData/i_number_huge_exp.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_neg_int_huge_exp.json → test/RFC8259JsonData/i_number_neg_int_huge_exp.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_pos_double_huge_exp.json → test/RFC8259JsonData/i_number_pos_double_huge_exp.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_real_neg_overflow.json → test/RFC8259JsonData/i_number_real_neg_overflow.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_real_pos_overflow.json → test/RFC8259JsonData/i_number_real_pos_overflow.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_real_underflow.json → test/RFC8259JsonData/i_number_real_underflow.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_too_big_neg_int.json → test/RFC8259JsonData/i_number_too_big_neg_int.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_too_big_pos_int.json → test/RFC8259JsonData/i_number_too_big_pos_int.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_number_very_big_negative_int.json → test/RFC8259JsonData/i_number_very_big_negative_int.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_object_key_lone_2nd_surrogate.json → test/RFC8259JsonData/i_object_key_lone_2nd_surrogate.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_1st_surrogate_but_2nd_missing.json → test/RFC8259JsonData/i_string_1st_surrogate_but_2nd_missing.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_1st_valid_surrogate_2nd_invalid.json → test/RFC8259JsonData/i_string_1st_valid_surrogate_2nd_invalid.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_UTF-16LE_with_BOM.json → test/RFC8259JsonData/i_string_UTF-16LE_with_BOM.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_UTF-8_invalid_sequence.json → test/RFC8259JsonData/i_string_UTF-8_invalid_sequence.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_UTF8_surrogate_U+D800.json → test/RFC8259JsonData/i_string_UTF8_surrogate_U+D800.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_incomplete_surrogate_and_escape_valid.json → test/RFC8259JsonData/i_string_incomplete_surrogate_and_escape_valid.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_incomplete_surrogate_pair.json → test/RFC8259JsonData/i_string_incomplete_surrogate_pair.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_incomplete_surrogates_escape_valid.json → test/RFC8259JsonData/i_string_incomplete_surrogates_escape_valid.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_invalid_lonely_surrogate.json → test/RFC8259JsonData/i_string_invalid_lonely_surrogate.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_invalid_surrogate.json → test/RFC8259JsonData/i_string_invalid_surrogate.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_invalid_utf-8.json → test/RFC8259JsonData/i_string_invalid_utf-8.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_inverted_surrogates_U+1D11E.json → test/RFC8259JsonData/i_string_inverted_surrogates_U+1D11E.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_iso_latin_1.json → test/RFC8259JsonData/i_string_iso_latin_1.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_lone_second_surrogate.json → test/RFC8259JsonData/i_string_lone_second_surrogate.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_lone_utf8_continuation_byte.json → test/RFC8259JsonData/i_string_lone_utf8_continuation_byte.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_not_in_unicode_range.json → test/RFC8259JsonData/i_string_not_in_unicode_range.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_overlong_sequence_2_bytes.json → test/RFC8259JsonData/i_string_overlong_sequence_2_bytes.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_overlong_sequence_6_bytes.json → test/RFC8259JsonData/i_string_overlong_sequence_6_bytes.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_overlong_sequence_6_bytes_null.json → test/RFC8259JsonData/i_string_overlong_sequence_6_bytes_null.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_truncated-utf-8.json → test/RFC8259JsonData/i_string_truncated-utf-8.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_utf16BE_no_BOM.json → test/RFC8259JsonData/i_string_utf16BE_no_BOM.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_string_utf16LE_no_BOM.json → test/RFC8259JsonData/i_string_utf16LE_no_BOM.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_structure_500_nested_arrays.json → test/RFC8259JsonData/i_structure_500_nested_arrays.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/i_structure_UTF-8_BOM_empty_object.json → test/RFC8259JsonData/i_structure_UTF-8_BOM_empty_object.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_1_true_without_comma.json → test/RFC8259JsonData/n_array_1_true_without_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_a_invalid_utf8.json → test/RFC8259JsonData/n_array_a_invalid_utf8.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_colon_instead_of_comma.json → test/RFC8259JsonData/n_array_colon_instead_of_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_comma_after_close.json → test/RFC8259JsonData/n_array_comma_after_close.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_comma_and_number.json → test/RFC8259JsonData/n_array_comma_and_number.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_double_comma.json → test/RFC8259JsonData/n_array_double_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_double_extra_comma.json → test/RFC8259JsonData/n_array_double_extra_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_extra_close.json → test/RFC8259JsonData/n_array_extra_close.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_extra_comma.json → test/RFC8259JsonData/n_array_extra_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_incomplete.json → test/RFC8259JsonData/n_array_incomplete.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_incomplete_invalid_value.json → test/RFC8259JsonData/n_array_incomplete_invalid_value.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_inner_array_no_comma.json → test/RFC8259JsonData/n_array_inner_array_no_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_invalid_utf8.json → test/RFC8259JsonData/n_array_invalid_utf8.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_items_separated_by_semicolon.json → test/RFC8259JsonData/n_array_items_separated_by_semicolon.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_just_comma.json → test/RFC8259JsonData/n_array_just_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_just_minus.json → test/RFC8259JsonData/n_array_just_minus.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_missing_value.json → test/RFC8259JsonData/n_array_missing_value.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_newlines_unclosed.json → test/RFC8259JsonData/n_array_newlines_unclosed.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_number_and_comma.json → test/RFC8259JsonData/n_array_number_and_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_number_and_several_commas.json → test/RFC8259JsonData/n_array_number_and_several_commas.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_spaces_vertical_tab_formfeed.json → test/RFC8259JsonData/n_array_spaces_vertical_tab_formfeed.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_star_inside.json → test/RFC8259JsonData/n_array_star_inside.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_unclosed.json → test/RFC8259JsonData/n_array_unclosed.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_unclosed_trailing_comma.json → test/RFC8259JsonData/n_array_unclosed_trailing_comma.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_unclosed_with_new_lines.json → test/RFC8259JsonData/n_array_unclosed_with_new_lines.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_array_unclosed_with_object_inside.json → test/RFC8259JsonData/n_array_unclosed_with_object_inside.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_incomplete_false.json → test/RFC8259JsonData/n_incomplete_false.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_incomplete_null.json → test/RFC8259JsonData/n_incomplete_null.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_incomplete_true.json → test/RFC8259JsonData/n_incomplete_true.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_multidigit_number_then_00.json → test/RFC8259JsonData/n_multidigit_number_then_00.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_++.json → test/RFC8259JsonData/n_number_++.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_+1.json → test/RFC8259JsonData/n_number_+1.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_+Inf.json → test/RFC8259JsonData/n_number_+Inf.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_-01.json → test/RFC8259JsonData/n_number_-01.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_-1.0..json → test/RFC8259JsonData/n_number_-1.0..json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_-2..json → test/RFC8259JsonData/n_number_-2..json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_-NaN.json → test/RFC8259JsonData/n_number_-NaN.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_.-1.json → test/RFC8259JsonData/n_number_.-1.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_.2e-3.json → test/RFC8259JsonData/n_number_.2e-3.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0.1.2.json → test/RFC8259JsonData/n_number_0.1.2.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0.3e+.json → test/RFC8259JsonData/n_number_0.3e+.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0.3e.json → test/RFC8259JsonData/n_number_0.3e.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0.e1.json → test/RFC8259JsonData/n_number_0.e1.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0_capital_E+.json → test/RFC8259JsonData/n_number_0_capital_E+.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0_capital_E.json → test/RFC8259JsonData/n_number_0_capital_E.json


+ 0 - 0
RyanJsonExample/RFC8259JsonData/n_number_0e+.json → test/RFC8259JsonData/n_number_0e+.json


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است