c++结构体与json字符串互相转换.用到了c++20标准(module).
c++20
-
linux,clang17
-
windows,msvc latest
使用xmake最新版:
cd <project-path>
xmake c -va
xmake -vDwr
参考目录example
//将会转换 json字符串json_str 与 c++结构体People
struct People
{
std::string dasd;
int a2;
std::vector<int> n;
// 也可以指定一个key
JS_OBJECT(JS_MEMBER(dasd), JS_MEMBER(a2,"faa阿萨德撒安抚"), JS_MEMBER(n, "达到loo5"));
};
auto json_str=R"(
{
"dasd":"aasdaffa",
"faa阿萨德撒安抚":5,
"达到loo5":null
}
)";
cd <project-path>/example
xmake -vD -P .
xmake run -P .
需要cmake3.28,在你的工程目录clone当前项目,然后添加以下内容到你的CMakeLists.txt
add_subdirectory(lsf)
# 自己的模块库,目前需要c++版本一致,所以需要设置库版本
# 默认使用c++20,如果你使用更高的标准,例如c++23,库也必须要一致.你可以使用下述修改.
# 这是必须的,目前,库和你的应用的标准需要一致.
# set_property(TARGET lsf PROPERTY CXX_STANDARD 23)
target_link_libraries(${appname} lsf)
目前支持:
int|long|double
<->json numberbool
<-> json true falsestd::string
<->json stringstd::vector
<-> json array- 指针(不建议使用) <->json object | null
- 普通struct(聚合类型aggregate) <->json object
如果需要支持其他类型(非std::vector和普通struct类型,目前未提供替换它们的方式),如char *
等,需要特化:
export template <typename T>
void parse_cpp_type(T &s, FetchCppType &fct);
如果需要增加其他功能,则继承FetchCppType
类.
-
从普通字符串转化为宽字符串受locale影响(默认与当前系统字符编码一致)
-
保留空白.标准json不接受注释,但也是保留c和c++风格的注释(留下了支持的接口)
-
标准来自rfc8259和https://www.json.org/json-zh.html 网站
-
处理各个词法单元的自动机,词法分析器是手写的
-
ll(1)语法分析器的各个产生式
-
简化的定义struct的宏
-
记录词法分析过程中token在原始输入流的位置
-
合并TreeBuilder和SerializeBuilder接口
-
json中的null在c++的struct中不能很好地对应.c++每个实体都有值.null映射指针还算合理