apiPatterns.md,所有权细节看 ownershipAndErrors.md。hooksInitPolicy.md、rtThreadExamples.md。RyanJsonInitHooks(malloc, free, realloc)RyanJsonTrue,失败返回 RyanJsonFalse。jsonMalloc/jsonFree/jsonRealloc 全局指针默认是 NULL(RyanJson/RyanJson.c)。RyanJsonStrictObjectKeyCheck(RyanJsonConfig.h)true:Object 下拒绝重复 key(Parse/Insert/ReplaceByIndex 等路径更严格)。false:允许重复 key;按 key 查询/替换/删除通常命中第一个,语义由上层约束。RyanJsonFree(void *block)RyanJsonPrint 返回的动态字符串。RyanJsonParse(const char *text)\0 结尾字符串。NULL。RyanJsonDelete。RyanJsonParseOptions(text, strlen(text), RyanJsonFalse, NULL)。RyanJsonParseOptions(text, size, requireNullTerminator, parseEndPtr)\0 缓冲区或精确控制解析终点。requireNullTerminator = RyanJsonTrue 时,解析后仅允许尾部空白。RyanJsonCreateNull(key)RyanJsonCreateBool(key, boolean)RyanJsonCreateInt(key, number)RyanJsonCreateDouble(key, number)RyanJsonCreateString(key, string)RyanJsonCreateObject()RyanJsonCreateArray()RyanJsonCreateIntArray(numbers, count)RyanJsonCreateDoubleArray(numbers, count)RyanJsonCreateStringArray(strings, count)语义:
RyanJsonAddIntToObject / RyanJsonAddStringToObject ...RyanJsonAddIntToArray / RyanJsonAddStringToArray ...RyanJsonAddItemToObject(pJson, key, item) / RyanJsonAddItemToArrayAddItem 仅接受 Array/Object 节点。AddInt/AddString/...。RyanJsonInsert(pJson, index, item)index=0 头插。index=UINT32_MAX 或越界可视为尾插。item 带 key。所有权:
item 转移到父节点。item 为游离节点时,Add/Insert 失败路径由库侧清理。item 非游离节点时,直接返回 false,不接管释放(保护原树)。AddItemToObject 传入标量时会直接失败并删除该标量节点(当前实现语义)。RyanJsonChangeKey(pJson, key)RyanJsonChangeStringValue(pJson, strValue)RyanJsonChangeIntValue(pJson, number)RyanJsonChangeDoubleValue(pJson, number)RyanJsonChangeBoolValue(pJson, boolean)规则:
RyanJsonFalse。RyanJsonReplaceByIndex(pJson, index, item)ReplaceByKey)。RyanJsonReplaceByKey(pJson, key, item)item 无 key 时会按目标 key 包装。item 有 key 且不同于目标 key 时会尝试改 key。规则:
item 为游离节点(RyanJsonIsDetachedItem)。item,调用方负责复用或释放。RyanJsonGetObjectByKey / RyanJsonGetObjectByIndexRyanJsonHasObjectByKey / RyanJsonHasObjectByIndexRyanJsonGetObjectToKey / RyanJsonGetObjectToIndex关键约束:
GetKey/GetString/GetInt/GetDouble/GetBool/GetObjectValue 这类取值前,必须先判空并用 RyanJsonIsXXX 判型。RyanJsonDetachByKey/DetachByIndexRyanJsonDelete(或再次挂树)。RyanJsonDeleteByKey/DeleteByIndexRyanJsonDelete(root)RyanJsonPrint:动态输出,返回值用 RyanJsonFree。RyanJsonPrintPreallocated:预分配输出,适合 RT-Thread 固定缓冲。Print(..., RyanJsonFalse, ...) / PrintPreallocated(..., RyanJsonFalse, ...) 直接输出紧凑 Json。RyanJsonMinify:原地文本清洗(去空白/注释),用于已有 Json 文本处理,不作为首选传输输出路径。RyanJsonMinify 终止符规则:
< textLen:会写入 \0;== textLen:不会额外写入 \0,调用方需自行保证字符串终止空间。RyanJsonCompare / RyanJsonCompareOnlyKey / RyanJsonCompareDouble。RyanJson/RyanJson.c(RyanJsonInitHooks 全局 hooks 初始化)RyanJson/RyanJsonParse.c(RyanJsonParse -> RyanJsonParseOptions(..., RyanJsonFalse, NULL))RyanJson/RyanJsonItem.c(RyanJsonInsert 失败清理、RyanJsonAddItemToObject 标量失败删除、RyanJsonReplaceByKey/ByIndex 失败不消费)test/unityTest/cases/core/testCreate.c(Insert/Add 失败语义与已挂树拒绝)test/unityTest/cases/core/testReplace.c(Replace 失败所有权)test/unityTest/cases/utils/testPrint.c(format=false 紧凑输出与 preallocated 行为)RyanJson/RyanJson.c 中 RyanJsonMinify 实现test/unityTest/cases/utils/testUtils.c、test/unityTest/cases/utils/testRobust.c、test/fuzzer/cases/fuzzerMinify.cRyanJsonChangeObjectValue 属于内部实现接口,不作为公开 API 使用。