0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

更低內存占用的通用Json庫-RyanJson

冬至子 ? 來源:Ryan_CW ? 作者:Ryan_CW ? 2023-08-24 17:23 ? 次閱讀

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 的測試結果

內存占用測試

1.jpg

RFC 8295 標準測試,大部分嵌入式場景不會出現(xiàn)復雜的特殊json結構
RyanJson和cJSON都不適合處理復雜的UTF-16字符集,如果項目需要兼容Unicode字符集,可以考慮yyjson / json-c

1.jpg

4、局限性
使用int / double表示json中的number類型,精度有所丟失。建議64位的number類型最好用string字符串表示。
對象中允許有重復的key,RyanJson庫采用單向鏈表,會訪問到第一個對象。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7492

    瀏覽量

    163842
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136840
  • RFC
    RFC
    +關注

    關注

    0

    文章

    16

    瀏覽量

    10109
  • JSON
    +關注

    關注

    0

    文章

    117

    瀏覽量

    6968
收藏 人收藏

    評論

    相關推薦

    mesh的內存占用能否優(yōu)化?

    我測試到esp_mesh在開啟的情況下,即打開wifi和打開mesh,DRAM會占用大約130kb內存。且測試發(fā)現(xiàn)esp32剩余內存不足大約60kb的時候系統(tǒng)會重啟。這樣來說300KB內存
    發(fā)表于 06-28 15:32

    stm32 使用u*** host占用內存空間很大?。?!

    如何解決stm32 使用u*** host占用內存空間很大的問題呢???
    發(fā)表于 01-22 16:44

    枚舉變量占用多少內存?

    枚舉變量占用多少內存
    發(fā)表于 10-11 08:07

    請問STM32可以用JSON嗎?

    STM32能不能支持JSON的操作
    發(fā)表于 10-23 07:45

    減少QQ內存占用的一則方法

    減少QQ內存占用的一則方法 隨著QQ的功能越來越多,QQ占用的資源也是越來越多,為了減小它的資源占用量,大家想出了多種方法其中有把
    發(fā)表于 01-14 11:23 ?687次閱讀

    Android高效內存:讓圖片占用盡可能少的內存

    在做內存優(yōu)化的時候,我們發(fā)現(xiàn)除了解決內存泄露問題,剩下的就只有想辦法減少真實的內存占用。而在App中,大部分內存可能被我們圖片
    的頭像 發(fā)表于 06-02 11:05 ?4921次閱讀

    Java服務器內存和CPU占用過高的原因

    造成服務器內存占用過高只有兩種情況:內存溢出或內存泄漏
    的頭像 發(fā)表于 03-21 15:50 ?2.2w次閱讀

    電腦內存占用過高加內存條起作用嗎

    電腦內存占用過高加內存條有用。內存容量小是內容占用過高的其中一個原因,所以加內存條可以解決問題;
    發(fā)表于 06-16 10:25 ?6678次閱讀

    虛擬機:查看進程內存和CPU占用的方法

    虛擬機:查看進程內存和CPU占用的方法
    的頭像 發(fā)表于 06-22 11:06 ?8492次閱讀

    Linux:測試進程占用的虛擬內存大小

    Linux:測試進程占用的虛擬內存大小
    的頭像 發(fā)表于 06-23 09:23 ?2889次閱讀
    Linux:測試進程<b class='flag-5'>占用</b>的虛擬<b class='flag-5'>內存</b>大小

    面向NoSQL數(shù)據(jù)JSON文檔異常檢測模型

    數(shù)據(jù)常用的數(shù)據(jù)存儲格式,JSON因簡單性和靈活性備受歡迎。然而,NoSαL數(shù)據(jù)缺乏模弌信息,在JSON文檔存入數(shù)據(jù)辶前,需要對其進行數(shù)
    發(fā)表于 04-13 15:30 ?20次下載
    面向NoSQL數(shù)據(jù)<b class='flag-5'>庫</b>的<b class='flag-5'>JSON</b>文檔異常檢測模型

    自編適用于嵌入式單片機Json封包與解析的程序

    @[TOC]**自編適用于嵌入式單片機Json封包與解析的程序**說明:由于網(wǎng)上提供的標準JSON,對向單片機這類的小設備占用資源過多,很不實際,所以用C語言自編,在平臺STM32F
    發(fā)表于 12-05 16:51 ?17次下載
    自編適用于嵌入式單片機<b class='flag-5'>Json</b>封包與解析的程序

    Windows不明內存占用案例分析:Driver Locked

    前一段有客戶反映Windows系統(tǒng)下不明內存占用越來越多,128GB物理內存的主機,啟動完成后就有大約一半的內存占用,導致留給應用的
    的頭像 發(fā)表于 09-25 14:49 ?1938次閱讀
    Windows不明<b class='flag-5'>內存</b><b class='flag-5'>占用</b>案例分析:Driver Locked

    什么是JSON數(shù)據(jù)

    如何理解JSON數(shù)據(jù)?作為NoSQL數(shù)據(jù)的一種類型,JSON數(shù)據(jù)有哪些優(yōu)勢呢?JSON數(shù)據(jù)
    的頭像 發(fā)表于 12-02 08:04 ?871次閱讀
    什么是<b class='flag-5'>JSON</b>數(shù)據(jù)<b class='flag-5'>庫</b>

    關于JSON數(shù)據(jù)

    如何理解JSON數(shù)據(jù)?作為NoSQL數(shù)據(jù)的一種類型,JSON數(shù)據(jù)有哪些優(yōu)勢呢?JSON數(shù)據(jù)
    的頭像 發(fā)表于 12-06 13:46 ?880次閱讀
    關于<b class='flag-5'>JSON</b>數(shù)據(jù)<b class='flag-5'>庫</b>