1、介紹
RyanJson是一個小巧的c語言json解析器,包含json文本文件解析 / 生成,專門針對內(nèi)存占用進行優(yōu)化,相比cJSON內(nèi)存占用減少30% - 60%,運行速度和cJSON差不多。
低內(nèi)存占用:使用動態(tài)擴展技術,在32位系統(tǒng)下,一個基礎json節(jié)點僅占用8字節(jié)。
開發(fā)人員友好:僅有一個c文件和頭文件輕松集成,hook函數(shù)方便自定義內(nèi)存鉤子。類cJSON的api,遷移成本低。
嚴格但不嚴苛:符合 RFC 8295 大部分JSON標準,支持無限的json嵌套級別(需注意堆??臻g)、靈活的配置修改項
可擴展性:允許注釋(需調(diào)用mini函數(shù)清除注釋后再解析)、尾隨逗號等無效字符(parse時可配置是否允許)等
2、設計
RyanJson設計時大量借鑒了 json 和 cJSON ! 是從 json 的基礎上修改來的
json語法是JavaScript對象語法的子集
在json語法中,數(shù)據(jù)以鍵值對的形式存儲(數(shù)組沒有key)
在RyanJson解析器中,使用結(jié)構(gòu)體來表示一個鍵值對,是存儲的最小單元,結(jié)構(gòu)如下:
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;
此結(jié)構(gòu)體包含兩個固定成員 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": {
...
}
}
此結(jié)構(gòu)體還包括兩個可能動態(tài)創(chuàng)建的成員 key 和 value;
key:存儲鍵值對的 key 信息,當存在key時會在申請RyanJsonNode內(nèi)存時,動態(tài)添加。
value:存儲鍵值對的 value 信息,會根據(jù)不同節(jié)點類型創(chuàng)建不同的value值。會在申請RyanJsonNode內(nèi)存時,動態(tài)添加。
3、測試
測試代碼可在本項目根目錄查看。
性能測試
RyanDocs文檔中心,有基于 yyjson_benchmark 的測試結(jié)果
內(nèi)存占用測試
RFC 8295 標準測試,大部分嵌入式場景不會出現(xiàn)復雜的特殊json結(jié)構(gòu)
RyanJson和cJSON都不適合處理復雜的UTF-16字符集,如果項目需要兼容Unicode字符集,可以考慮yyjson / json-c
4、局限性
使用int / double表示json中的number類型,精度有所丟失。建議64位的number類型最好用string字符串表示。
對象中允許有重復的key,RyanJson庫采用單向鏈表,會訪問到第一個對象。
-
存儲器
+關注
關注
38文章
7530瀏覽量
164412 -
C語言
+關注
關注
180文章
7615瀏覽量
137846 -
RFC
+關注
關注
0文章
16瀏覽量
10128 -
JSON
+關注
關注
0文章
119瀏覽量
7019
發(fā)布評論請先 登錄
相關推薦
mesh的內(nèi)存占用能否優(yōu)化?
減少Q(mào)Q內(nèi)存占用的一則方法
Android高效內(nèi)存:讓圖片占用盡可能少的內(nèi)存
電腦內(nèi)存占用過高加內(nèi)存條起作用嗎
面向NoSQL數(shù)據(jù)庫的JSON文檔異常檢測模型
![面向NoSQL數(shù)據(jù)<b class='flag-5'>庫</b>的<b class='flag-5'>JSON</b>文檔異常檢測模型](https://file.elecfans.com/web1/M00/EA/C2/pIYBAGB1SQ2AGwPHAACDcsE3Ljc522.png)
自編適用于嵌入式單片機Json封包與解析的程序
![自編適用于嵌入式單片機<b class='flag-5'>Json</b>封包與解析的程序](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Windows不明內(nèi)存占用案例分析:Driver Locked
![Windows不明<b class='flag-5'>內(nèi)存</b><b class='flag-5'>占用</b>案例分析:Driver Locked](https://file1.elecfans.com/web2/M00/A6/06/wKgaomURLWeAbIzrAAVAFCbD5_s074.jpg)
什么是JSON數(shù)據(jù)庫
![什么是<b class='flag-5'>JSON</b>數(shù)據(jù)<b class='flag-5'>庫</b>](https://file.elecfans.com/web2/M00/3F/D7/poYBAGJqPMKAEXjWAAAOpepuZJ8475.jpg)
關于JSON數(shù)據(jù)庫
![關于<b class='flag-5'>JSON</b>數(shù)據(jù)<b class='flag-5'>庫</b>](https://file1.elecfans.com//web2/M00/B2/D4/wKgaomVwCq6AaU0xAAAX8UkUmXU319.png)
評論