# json2cpp **Repository Path**: laser2000/json2cpp ## Basic Information - **Project Name**: json2cpp - **Description**: 把JSON描述的数据对象翻译为C++结构体定义,并生成一个函数来读取JSON对象到对应的C++结构体中 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-13 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # json2cpp #### 介绍 把JSON描述的数据对象翻译为C++结构体定义,并生成一个函数来读取JSON对象到对应的C++结构体中。 似乎有些多此一举,但是因为我需要大量使用枚举,但是json本身不支持。所以只好这样搞。 #### 软件架构 单一python脚本 #### 安装教程 需要jsoncon支持 #### 使用说明 ``` python json2cpp parameter.json enumdef.json ``` - parameter.json,描述json数据对象 - enumdef.json,定义需要的枚举 该操作生成两个文件 - input.hpp,包含parameter.json中的对象定义和enumdef.json中的枚举定义的C++版本 - input.cpp,包含一个基于jsoncon的对象读取函数,能够解析parameter.json中的对象赋 值到对应的C++结构体对象中 ##### 支持 - 注释,名称以"Comment_"开头的字符串 - 基本类型:整数、浮点数、字符串,以及枚举(名称以"en"开头的字符串) - 结构体类型 - 数组,包括基本类型的数组和结构体的数组,支持多维,且非均等长度 ##### 限制: - 不能区分实质相同的结构,如同下面的例子中,myobj和yourobj实质相同,但是还是会生成两个不同名的结构类型 - 目前只支持一个顶级对象 ##### 例子 ```json { "RUN": { "Comment_1": "----------Dimension variable-------------", "dim_tmean": 288.9, "outfield": 200, "enlinear_solver":"dadi", "xyz":[1.0, 2.0, 3.0], "XYZ":[ [1,2], [3,4], [5,6,7] ], "myobj":[ { "name":"obj_name1", "num":13, "props":[1,3,5,7] }, { "name":"obj_name2", "num":15, "props":[2,4,6,8,10] } ], "yourobj": { "name":"obj_name3", "num":15, "props":[2,4,6,8,10] } } } ``` 枚举定义为 ```json { "enum_def": { "eum_linear_solver": { "lusgs": 0, "dadi": 1 } } } ``` 生成的input.hpp为 ```cpp #ifndef INPUT_JSON_H #define INPUT_JSON_H /*---------- input.hpp ------------*/ #include #include enum class eum_linear_solver{lusgs = 0,dadi = 1}; typedef struct myobj_t { int num; std::string name; std::vector< int > props ; } MYOBJ_TYPE; typedef struct yourobj_t { int num; std::string name; std::vector< int > props ; } YOUROBJ_TYPE; typedef struct RUN_t { int outfield; int linear_solver; // This line is a comments skipped struct yourobj_t yourobj; std::vector< double > xyz ; std::vector< std::vector< int > > XYZ ; std::vector< struct myobj_t > myobj; double dim_tmean; } RUN_TYPE; int read_input(RUN_TYPE &Run, const char* fname); #endif ``` 和input.cpp 为 ```cpp #include "input.hpp" #include #include #include #include using jsoncons::json; int read_input(RUN_TYPE &RUN, const char *fname) { std::map enmap; std::string tmpstr; std::ifstream is(fname); json jsoninp = json::parse(is); enmap["CFL3D_method"] = 1; enmap["original_method"] = 0; enmap["steady_rlv"] = 0; enmap["sutherlands_rlv"] = 1; enmap["viscous"] = 1; enmap["inviscous"] = 0; enmap["METHOD2"] = 1; enmap["METHOD3"] = 2; enmap["METHOD1"] = 0; enmap["three_dimension"] = 0; enmap["two_dimension"] = 1; enmap["on"] = 1; enmap["off"] = 0; enmap["sst"] = 1; enmap["noturb"] = 0; enmap["muti_grid"] = 1; enmap["single_grid"] = 0; enmap["steady"] = 0; enmap["dynamic_mesh"] = 2; enmap["unsteady"] = 1; enmap["init_from_file"] = 1; enmap["init_from_freestream"] = 0; enmap["kapa_negativeone"] = 0; enmap["kapp_one"] = 3; enmap["kapa_onethird"] = 2; enmap["on"] = 1; enmap["off"] = 0; enmap["ausmdv"] = 0; enmap["roe"] = 1; enmap["lusgs"] = 0; enmap["dadi"] = 1; enmap["one_order_accuracy"] = -1; enmap["vanalbda"] = 1; enmap["xminmod"] = 2; enmap["no_limit"] = 0; RUN.outfield = jsoninp["RUN"]["outfield"].as(); RUN.sing_muti_grid = enmap[jsoninp["RUN"]["ensing_muti_grid"].as()]; // RUN.xyz.resize(jsoninp["RUN"]["xyz"].size()); for (int ixyz0 = 0; ixyz0 < jsoninp["RUN"]["xyz"].size(); ixyz0++) { RUN.xyz[ixyz0] = jsoninp["RUN"]["xyz"][ixyz0].as(); } RUN.linear_solver = enmap[jsoninp["RUN"]["enlinear_solver"].as()]; RUN.XYZ.resize(jsoninp["RUN"]["XYZ"].size()); for (int iXYZ0 = 0; iXYZ0 < jsoninp["RUN"]["XYZ"].size(); iXYZ0++) { RUN.XYZ[iXYZ0].resize(jsoninp["RUN"]["XYZ"][iXYZ0].size()); for (int iXYZ1 = 0; iXYZ1 < jsoninp["RUN"]["XYZ"][iXYZ0].size(); iXYZ1++) { RUN.XYZ[iXYZ0][iXYZ1] = jsoninp["RUN"]["XYZ"][iXYZ0][iXYZ1].as(); } } RUN.myobj.resize(jsoninp["RUN"]["myobj"].size()); for (int imyobj0 = 0; imyobj0 < jsoninp["RUN"]["myobj"].size(); imyobj0++) { RUN.myobj[imyobj0].num = jsoninp["RUN"]["myobj"][imyobj0]["num"].as(); RUN.myobj[imyobj0].name = jsoninp["RUN"]["myobj"][imyobj0]["name"].as(); RUN.myobj[imyobj0].props.resize(jsoninp["RUN"]["myobj"][imyobj0]["props"].size()); for (int iprops0 = 0; iprops0 < jsoninp["RUN"]["myobj"][imyobj0]["props"].size(); iprops0++) { RUN.myobj[imyobj0].props[iprops0] = jsoninp["RUN"]["myobj"][imyobj0]["props"][iprops0].as(); } } RUN.dim_tmean = jsoninp["RUN"]["dim_tmean"].as(); RUN.yourobj.num = jsoninp["RUN"]["yourobj"]["num"].as(); RUN.yourobj.name = jsoninp["RUN"]["yourobj"]["name"].as(); RUN.yourobj.props.resize(jsoninp["RUN"]["yourobj"]["props"].size()); for (int iprops0 = 0; iprops0 < jsoninp["RUN"]["yourobj"]["props"].size(); iprops0++) { RUN.yourobj.props[iprops0] = jsoninp["RUN"]["yourobj"]["props"][iprops0].as(); } } ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)