Skip to content
xyz347 edited this page Nov 19, 2018 · 1 revision

Welcome to the x2struct wiki!

  • x2struct用于 jsonC++结构体之间的互转。
  • 支持bsonC++结构体之间的互转,用途可以参考mongoxclient
  • 支持xml/libconfigC++结构体之间的互转,但是不完备
  • 支持C++结构体Golang结构体,但是不完备
  • 缺省值开启了json/xml的支持,可以通过修改config.h来选择要支持的功能
  • 下面的介绍中,将json/bson/xml/libconfig称之为X

使用方法

  • 包含 x2struct.hpp 头文件
  • 结构体后面添加宏XTOSTRUCT,将成员变量放在O/M/A之一里面
  • 调用x2struct::X的相关函数即可在X和C++结构体之间进行转换:
    • loadjson(const std::string&str, TYPE&t, bool isfile=true) json转C++结构体,如果isfile是true,则str表征的是一个文件名
    • tojson(const TYPE&t, const std::string&root="", int indentCount=-1, char indentChar=' ') C++结构体转json,后面两个参数用于控制缩进,缺省是没有缩进的。如果需要用一个tab做缩进,则后面两个参数可以填1,'\t'。
    • loadxml(const std::string&str, TYPE&t, bool isfile=true) xml转C++结构体
    • toxml(const TYPE&t, const std::string&root, int indentCount=-1, char indentChar=' ') C++结构体转xml
    • loadbson(const uint8_t*data, size_t length, TYPE&t, bool copy=true) bson转C++结构体,如果copy是true,则表征会复制data内容,这样上层的data即使析构了也不影响。
    • loadbson(const std::string&data, TYPE&t, bool copy=true) 同上
    • tobson(const TYPE& t) C++结构体转bson
    • loadconfig(const std::string&str, TYPE&t, bool isfile=true, const std::string&root="") libconfig转C++结构体
    • toconfig(const TYPE&t, const std::string&root, int indentCount=-1, char indentChar=' ') C++结构体转libconfig
    • togocode(const TYPE&t, bool json, bool bson, bool xml) C++结构体转Golang结构体

xhas

xhas用于检查某个key是否存在,比如

struct example {
    int a;
    std::string b;
    XTOSTRUCT(O(a,b));
};
void func() {
    std::string json("{\"a\":1}");
    example st;
    x2struct::X::loadjson(json, st, false);
    st.xhas("a"); // return true
    st.xhas("b"); // return false
}

XTOSTRUCT里面O/A/M的区别

O

O是相对M来说的,所以看M的解释即可

M

M用于一些关键的变量,要求X里面必须存在的场景。比如

struct example {
    int id;
    std::string name;
    int age;
    XTOSTRUCT(M(id,name), O(age));
};
void func() {
    std::string json("{\"id\":1, \"age\":30}");
    example st;
    x2struct::X::loadjson(json, st, false); //会抛出异常,因为name是M里面的,但是json里面没有
}
  • M的意义在于不用一个个的去xhas判断。
  • O和M都可以包含多个变量
  • O和M都仅用于X到C++结构体的转换,结构体转X是一样的。

A

A的作用是别名,A一次只能包含一个变量,写法是A(变量名,"xxx"),xxx表征别名控制字符串

  • X转C++结构体的时候,优先别名,如果不存在,则找变量名。比如对于A(id,"_id")来说,{"id":1}和{"_id":1}都会解析成功。
  • C++结构体转X的时候,使用别名。
  • 别名可以指定类型,比如A(id, "bson:_id json:jid")则表示bson用_id这个别名,json用jid这个别名,其他还是用id
  • 别名可以部分指定类型,比如A(id, "bson:_id xid")则表示bson用_id这个别名,其他用xid这个别名
  • 别名可以加mandatory选项,用me表示,比如A(id, "bson:_id,me")则表示bson用_id这个别名,且是必须存在的,其他的还是用id,且可选
Clone this wiki locally