-
Notifications
You must be signed in to change notification settings - Fork 107
Home
xyz347 edited this page Nov 19, 2018
·
1 revision
- x2struct用于 json和C++结构体之间的互转。
- 支持bson和C++结构体之间的互转,用途可以参考mongoxclient
- 支持xml/libconfig和C++结构体之间的互转,但是不完备
- 支持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用于检查某个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
}
O是相对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(变量名,"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,且可选