快速的JSON C++序列化庫,ajson 0.2.0版發布

jopen 8年前發布 | 12K 次閱讀

http://git.oschina.net/lordoffox/ajson

 

ajson

a utility for serialize C++ and json.

動機:

為什么要設計ajson?

在工作中經常有這樣的需求,獲得一段json編碼的文本,將它解析為dom對象(比如rapidjson)。

然后讀取各節點的值,為了方便,經常將其保存到某個數據結構。

然后這個dom就不需要了,這里dom的解析和構建就感覺到了浪費。

也有反過來的情況,將一個C++結構體,序列化到dom,然后將dom再次序列化到文本。

再次,感覺到了dom的浪費。

這時,我希望能有一個像javescript那樣方便的將json文本到數據結構直接方便的轉換。

于是ajson就誕生了。

簡介


struct Person {

std::string Name;

int Age;

};

AJSON(Person , v.Name , v.Age))

Person obj;

char * json= "{ \"Name\" : \"Boo\", \"Age\" : 28}";

ajson::load_from_buff(obj,json);

以上代碼解釋了什么是AJSON,AJSON還支持stl的順序容器。

再來個復雜點的例子

enum PhoneType

{

MOBILE = 0,

HOME = 1,

WORK = 2

};

struct PhoneNumber

{ std::string number;

PhoneType type = MOBILE;

PhoneNumber(std::string const& number_ = "", PhoneType type_ = MOBILE)

:number(number_),type(type_)

{}

};

struct Person

{

std::string name;

int32_t id;

std::string mail;

std::vector phones;

Person(std::string name_ = "" , int32_t id_ = 0, std::string mail_ = "")

:name(name_),id(id_),mail(mail_)

{}

};

struct AddressBook

{

std::vector peoples;

};

AJSON(PhoneNumber, v.number, v.type);

AJSON(Person, v.name, v.id, v.mail, v.phones);

AJSON(AddressBook, v.peoples);

結構體支持嵌套,stl容器也支持嵌套。


特點

ajson反序列化掃描的時候,直接將字面量類型同時解析,并將結果直接存入對應的數據結構字段。

如此一來就不需要臨時的DOM,減少了中間處理的工作以及內存的申請釋放,大大提升了性能。

使用方式簡單,只要定義相應的宏AJSON,便可方便的序列化/反序列化操作。

依賴小,完全不依賴第三方庫,只有一個頭文件,省去了編譯的麻煩。

要點

如果json內部附帶了轉義符,ajson會改動原始文本來避免新申請內存。

如果不希望原始文本被修改,請創建一份新的拷貝。

由于ajson全是內存操作,文件讀取操作時,將會全部讀入內存,所以不適合大文件操作。

其他

為什么要選擇json而不是xml?

因為json的數據描述更符合C++的數據描述, 舉個例子,xml有Node和Attribute兩種方式, 給出一個C++的Struct的Member field, 應該對應那種類型呢,如果是寫入, 那么寫成Node呢還是Attribute呢, 這里面對一個二義性問題。


AJSON完全免費,沒有任何限制,使用boost的授權方式。

0.2.0版本

相對于0.1.x版本,ajson沒有功能上的增加,主要的改動是去掉了對rapidjson和boost的依賴,完全獨立了。

 

更新內容

移除boost依賴

移除rapidjson依賴

使用方式微量調整

檢測utf8的BOM頭

讀取性能大幅提升

來自: http://www.oschina.net//news/70848/ajson-0-2-0

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!