Code Monkey home page Code Monkey logo

ajson's Introduction

ajson

0.2.0版本要求C++11的编译器

a utility for serialize C++ and json.

动机:

为什么要设计ajson?

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

然后读取各节点的值,为了方便,经常将其保存到某个数据结构。

然后这个dom就不需要了,这里dom的解析和构建就感觉到了浪费。

也有反过来的情况,将一个C++结构体,序列化到dom,然后将dom再次序列化到文本。

再次,感觉到了dom的浪费,能跳过dom这层吗?

这时,我希望能有一个像javascript那样方便的将json文本到数据结构直接方便的转换。

于是ajson就诞生了。

简介

------------------------------------------------------------------

struct Person
{

  std::string  Name;
  
  int          Age;
  
};

AJSON(Person , Name , 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<PhoneNumber> phones;

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

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

  {}

};

struct AddressBook

{

  std::vector<Person> peoples;

};

AJSON(PhoneNumber, number, type)

AJSON(Person, name, id, mail, phones)

AJSON(AddressBook, 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.2版本

修改原先的内存修改策略,改为不修改源数据内存, 老的方式重新声明文件为ajson_msd.hpp, 习惯老方式的用户可以沿用, 新的方式会有轻微的性能降低,但是使用方式的限制取消了

0.2.1版本

去掉了宏定义中的v.语法,感谢奏之章的建议 注意:由于该改动,ajson不能使用在final修饰的class上

0.2.0版本

相对于0.1.x版本,ajson没有功能上的增加,主要的改动是去掉了对rapidjson和boost的依赖,完全独立了。

ajson's People

Contributors

lordoffox avatar mm304321141 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ajson's Issues

utf8-bom file check fail

warning: result of comparison of constant 239 with expression of type 'char' is always false [-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF)

请问, boost::ajson 报错,说 "boost"不明确 是怎么回事?

请问, boost::ajson 报错,说 "boost"不明确 是怎么回事?

VS2013, 配置了boost, rapidjson也有.

错误 3 error C2440: “=”: 无法从“rapidjson::GenericMemberIterator<false,Encoding,Allocator>”转换为“rapidjson::GenericMember<Encoding,Allocator> *” c:\users\administrator\documents\visual studio 2013\projects\outsourcing.solutions\55likemw\cxtrademw\cxtradespiimpl.cpp 16 1 CXTradeMW

5 IntelliSense: "boost" 不明确 c:\Users\Administrator\Documents\Visual Studio 2013\Projects\Outsourcing.Solutions\55LikeMW\CXTradeMW\CXTradeSpiImpl.cpp 12 17 CXTradeMW

6   IntelliSense:  不存在从 "rapidjson::GenericMemberIterator<false, rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>" 到 "rapidjson::GenericMember<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>> *" 的适当转换函数    c:\Users\Administrator\Documents\Visual Studio 2013\Projects\Outsourcing.Solutions\55LikeMW\CXTradeMW\CXTradeSpiImpl.cpp    16  1   CXTradeMW

最近在QT里面用了下该程序

release 崩溃,debug正常;
修改release下的makefile.release文件,去掉优化 也正常;
使用的是mingw 64-bit编译器。
另外出问题的只是结构体转json的功能,其它没测。该结构体只有int、double、string(非QString)类型。
示例中给出的
string_stream ss;
save_to(ss,obj);
经过我测试,使用std::stringstream,在release下程序不崩溃。

判断一个类型是否具有emplace_back方法的正确姿势

`template<typename T, typename = void>
struct has_emplace_back : std::false_type {};

template
struct has_emplace_back <T, decltype(std::declval().emplace_back(), void())> : std::true_type {};`

替换你那个is_emplace_back_able数值型元函数可好?

如何添加支持其他容器?

为了支持tsl::robin_map, 在ajson.hpp的158行,添加is_template_instant_of<tsl::robin_map, T>::value ||
编译报错:

src/ajson/ajson.hpp:158:47: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class ...> class U, class T> struct ajson::detail::is_template_instant_of’
  158 |       is_template_instant_of<tsl::robin_map, T>::value ||
      |                                               ^
src/ajson/ajson.hpp:158:47: note:   expected a template of type ‘template<class ...> class U’, got ‘template<class Key, class T, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy> class tsl::robin_map’

似乎是is_template_instant_of不支持模板里有非类型模板参数, 怎么办?

split_fields error

测试代码:
int main() { const char* json = "{ \"Name\" : \"Boo\", \"Age\" : 28}"; field_list list = split_fields(json); for (auto it: list) { char arr[20] = {0}; std::memcpy(arr, it.str, it.len); printf("char* %s\n", arr); } return 0; }
测试结果:
char* { char* Name" char* "Boo" char* "Age" char* 28}
问题:
Name中,没有包含开始的"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.