1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

新闻 ajson 0.2.0版发布,飞快的JSON C++序列化库 下载

本帖由 漂亮的石头2016-02-19 发布。版面名称:软件资讯

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    487,424
    赞:
    47
    http://git.oschina.net/lordoffox/ajson



    ajson


    [COLOR=rgba(0, 0, 0, 0.8)]a utility for serialize C++ and json.[/COLOR]

    动机:


    [COLOR=rgba(0, 0, 0, 0.8)]为什么要设计ajson?[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]在工作中经常有这样的需求,获得一段json编码的文本,将它解析为dom对象(比如rapidjson)。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]然后读取各节点的值,为了方便,经常将其保存到某个数据结构。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]然后这个dom就不需要了,这里dom的解析和构建就感觉到了浪费。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]也有反过来的情况,将一个C++结构体,序列化到dom,然后将dom再次序列化到文本。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]再次,感觉到了dom的浪费。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]这时,我希望能有一个像javescript那样方便的将json文本到数据结构直接方便的转换。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]于是ajson就诞生了。[/COLOR]

    简介


    [COLOR=rgba(0, 0, 0, 0.8)]struct Person {[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]std::string Name;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]int Age;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]};[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]AJSON(Person , v.Name , v.Age))[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]Person obj;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]char * json= "{ \"Name\" : \"Boo\", \"Age\" : 28}";[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]ajson::load_from_buff(obj,json);[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]以上代码解释了什么是AJSON,AJSON还支持stl的顺序容器。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]再来个复杂点的例子[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]enum PhoneType[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]{[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]MOBILE = 0,[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]HOME = 1,[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]WORK = 2[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]};[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]struct PhoneNumber[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]{ std::string number;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]PhoneType type = MOBILE;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]PhoneNumber(std::string const& number_ = "", PhoneType type_ = MOBILE)[/COLOR]

    :number(number_),type(type_)

    [COLOR=rgba(0, 0, 0, 0.8)]{}[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]};[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]struct Person[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]{[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]std::string name;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]int32_t id;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]std::string mail;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]std::vector phones;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]Person(std::string name_ = "" , int32_t id_ = 0, std::string mail_ = "")[/COLOR]

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

    [COLOR=rgba(0, 0, 0, 0.8)]{}[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]};[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]struct AddressBook[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]{[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]std::vector peoples;[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]};[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]AJSON(PhoneNumber, v.number, v.type);[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]AJSON(Person, v.name, v.id, v.mail, v.phones);[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]AJSON(AddressBook, v.peoples);[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]结构体支持嵌套,stl容器也支持嵌套。[/COLOR]

    特点


    [COLOR=rgba(0, 0, 0, 0.8)]ajson反序列化扫描的时候,直接将字面量类型同时解析,并将结果直接存入对应的数据结构字段。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]如此一来就不需要临时的DOM,减少了中间处理的工作以及内存的申请释放,大大提升了性能。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]使用方式简单,只要定义相应的宏AJSON,便可方便的序列化/反序列化操作。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]依赖小,完全不依赖第三方库,只有一个头文件,省去了编译的麻烦。[/COLOR]

    要点


    [COLOR=rgba(0, 0, 0, 0.8)]如果json内部附带了转义符,ajson会改动原始文本来避免新申请内存。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]如果不希望原始文本被修改,请创建一份新的拷贝。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]由于ajson全是内存操作,文件读取操作时,将会全部读入内存,所以不适合大文件操作。[/COLOR]

    其他


    [COLOR=rgba(0, 0, 0, 0.8)]为什么要选择json而不是xml?[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)]因为json的数据描述更符合C++的数据描述, 举个例子,xml有Node和Attribute两种方式, 给出一个C++的Struct的Member field, 应该对应那种类型呢,如果是写入, 那么写成Node呢还是Attribute呢, 这里面对一个二义性问题。[/COLOR]


    [COLOR=rgba(0, 0, 0, 0.8)]AJSON完全免费,没有任何限制,使用boost的授权方式。[/COLOR]

    0.2.0版本


    [COLOR=rgba(0, 0, 0, 0.8)]相对于0.1.x版本,ajson没有功能上的增加,主要的改动是去掉了对rapidjson和boost的依赖,完全独立了。[/COLOR]

    [COLOR=rgba(0, 0, 0, 0.8)][/COLOR]



    更新内容

    移除boost依赖

    移除rapidjson依赖

    使用方式微量调整

    检测utf8的BOM头

    读取性能大幅提升
    ajson 0.2.0版发布,飞快的JSON C++序列化库下载地址
     
正在加载...