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