1、介紹
RyanJson是一個小巧的c語言json解析器,包含json文本文件解析 / 生成,專門針對內存占用進行優化,相比cJSON內存占用減少30% - 60%,運行速度和cJSON差不多。
低內存占用:使用動態擴展技術,在32位系統下,一個基礎json節點僅占用8字節。
開發人員友好:僅有一個c文件和頭文件輕松集成,hook函數方便自定義內存鉤子。類cJSON的api,遷移成本低。
嚴格但不嚴苛:符合 RFC 8295 大部分JSON標準,支持無限的json嵌套級別(需注意堆棧空間)、靈活的配置修改項
可擴展性:允許注釋(需調用mini函數清除注釋后再解析)、尾隨逗號等無效字符(parse時可配置是否允許)等
2、設計
RyanJson設計時大量借鑒了 json 和 cJSON ! 是從 json 的基礎上修改來的
json語法是JavaScript對象語法的子集
在json語法中,數據以鍵值對的形式存儲(數組沒有key)
在RyanJson解析器中,使用結構體來表示一個鍵值對,是存儲的最小單元,結構如下:
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;
此結構體包含兩個固定成員 info 和 next;
info:為當前節點的配置信息用來表示 節點數據類型 和 flag標志位。
bits low --> high
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | NA | NA | .......
______________________________/ | | |
low 8bits | | |
| | | |
V | | |
RyanJsonTypeUnknow (bit0) | | |
RyanJsonTypeNull (bit1) | | |
RyanJsonTypeBool (bit2) | | +----> RyanJsonWithKeyFlag (1 << 10)
RyanJsonTypeNumber (bit3) | |
RyanJsonTypeString (bit4) | +--------> RyanJsonValueNumberIntFlag (1 << 9)
RyanJsonTypeArray (bit5) |
RyanJsonTypeObject (bit6) +------------> RyanJsonValueBoolTrueFlag (1 << 8)
spare (bit7)
next:指針指向鏈表下一個節點
{
"name": "RyanJson",
next (
"version": "xxx",
next (
"repository": "https://github.com/Ryan-CW-Code/RyanJson",
next (
"keywords": ["json", "streamlined", "parser"],
next ( _ item _/ _ next _/ _ next _/
"others": {
...
}
}
此結構體還包括兩個可能動態創建的成員 key 和 value;
key:存儲鍵值對的 key 信息,當存在key時會在申請RyanJsonNode內存時,動態添加。
value:存儲鍵值對的 value 信息,會根據不同節點類型創建不同的value值。會在申請RyanJsonNode內存時,動態添加。
3、測試
測試代碼可在本項目根目錄查看。
性能測試
RyanDocs文檔中心,有基于 yyjson_benchmark 的測試結果
內存占用測試
RFC 8295 標準測試,大部分嵌入式場景不會出現復雜的特殊json結構
RyanJson和cJSON都不適合處理復雜的UTF-16字符集,如果項目需要兼容Unicode字符集,可以考慮yyjson / json-c
4、局限性
使用int / double表示json中的number類型,精度有所丟失。建議64位的number類型最好用string字符串表示。
對象中允許有重復的key,RyanJson庫采用單向鏈表,會訪問到第一個對象。
-
存儲器
+關注
關注
38文章
7484瀏覽量
163765 -
C語言
+關注
關注
180文章
7604瀏覽量
136695 -
RFC
+關注
關注
0文章
16瀏覽量
10101 -
JSON
+關注
關注
0文章
117瀏覽量
6963
發布評論請先 登錄
相關推薦
評論