快速的JSON C++序列化庫,ajson 0.2.0版發布
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