c++类对象获得nlohmann::json配置的方便用法

前沿

自从了解了 nlohmann::json c++项目写起来也感觉很舒服了.
本文主要解决的问题为:
你有一个 c++ 的类或结构体,里面有很多配置的变量需要赋值. 你的配置写在 json 文件中,且json 文件有很多个 object, 每个object都可能有c++类需要的变量,如何比较方便地进行赋值.
比如你的类如下

class Data{
public:
	int v1;
	string v3;
	vector<int> v4;
	...
	...
	int v50;
};

json 文件如下

{
"task1":{
	"v1": 1,
	...
},
"task2":{
	"v4": [1,2,3,4,5],
	....
},
....

解决方案

  1. 第一步自然是要使你 c++ 变量的名字和 json 文件中的名字一致
  2. 第二步是写一个通用的赋值函数, 这个函数只有遇到有这个变量的时候才进行赋值
template <typename T>
bool get_value(const nlohmann::json &j, const string & nm, T& val){
    //if(j[nm].empty()) return false;
    if(j.find(nm) == j.end()) return false;
    else{
        j.at(nm).get_to(val);
        return true;
    }
}
  1. 最后用脚本语言生成类似如下的代码
void set_info_params(const nlohmann::json &j){
	get_value(j, "v1", info.v1);
	get_value(j, "v2", info.v2);
	......
}

这段代码可以多次调用,传入不同的json object

给出我任务中用到的ruby 脚本

def gen1(nm) 
    return "get_value(j, \"#{nm}\", #{nm});"
end
def gen2(nm) 
    return "get_value(j, \"#{nm}\", info.#{nm});"
end
nms=%w[
    bool issave_img;
    vector<int> check_range;

    string flm;
    string fpm;
    int n_lm;
    int n_exp;
    int n_dim_full;
    string fnm;
    string imgdir;
    string suffix;

    string fn_each3d;
    string fdense3d;
    string ftrans_s_t;
    string fpm_new;
    int rot;
    float scale;
]

for nm in nms
    next unless nm[-1]==";"
    nm = nm.split(";")[0]
    puts gen1 nm
end


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值