JSON は JavaScript Object Notation 記法のこと.
人間にも機械にもそれなりの可読性を持ったファイル形式である.
JSON ファイルを C++ で読み込むにはいくつかの方法があるが,ここでは picojson を紹介する.
{
"connect_param_angle":{
"slope2_x" :0.06,
"slope_x" :0.02,
"intercept_x":0.05,
"slope2_y":0.06,
"slope_y":0.02,
"intercept_y":0.05,
"slope2_r" :0.06,
"slope_r" :0.02,
"intercept_r":0.05,
"slope2_l":0.01,
"slope_l":0.03,
"intercept_l":0.05
},
"connect_param_position":{
"slope2_x" :0,
"slope_x" :100,
"intercept_x":30,
"slope2_y" :0,
"slope_y":100,
"intercept_y":30,
"slope2_r" :0,
"slope_r" :10,
"intercept_r":20,
"slope2_l" :1,
"slope_l":2,
"intercept_l":20
}
}
#include "picojson.h" #include <boost/filesystem.hpp> #include <fstream> namespace fs = boost::filesystem; void ReadJsonData(t2l_param ¶m, const std::string json_file_path) { if ( !fs::exists(json_file_path) ) throw std::runtime_error("File : " + json_file_path + " not found"); std::ifstream ifs(json_file_path); const std::string json((std::istreambuf_iterator<char >(ifs)), std::istreambuf_iterator<char >()); ifs.close(); picojson::value v; const std::string err = picojson::parse(v, json); if ( !err.empty() ) throw std::runtime_error("JSON parse error : " + err); picojson::object &all = v.get<picojson::object >(); picojson::object &connect_param_angle = all["connect_param_angle"].get<picojson::object >(); picojson::object &connect_param_position = all["connect_param_position"].get<picojson::object >(); param.intercept_ax = connect_param_angle["intercept_x"].get<double>(); param.intercept_ay = connect_param_angle["intercept_y"].get<double>(); param.intercept_ar = connect_param_angle["intercept_r"].get<double>(); param.intercept_al = connect_param_angle["intercept_l"].get<double>(); param.slope_ax = connect_param_angle["slope_x"].get<double>(); param.slope_ay = connect_param_angle["slope_y"].get<double>(); param.slope_ar = connect_param_angle["slope_r"].get<double>(); param.slope_al = connect_param_angle["slope_l"].get<double>(); param.slope2_ax = connect_param_angle["slope2_x"].get<double>(); param.slope2_ay = connect_param_angle["slope2_y"].get<double>(); param.slope2_ar = connect_param_angle["slope2_r"].get<double>(); param.slope2_al = connect_param_angle["slope2_l"].get<double>(); param.intercept_px = connect_param_position["intercept_x"].get<double>(); param.intercept_py = connect_param_position["intercept_y"].get<double>(); param.intercept_pr = connect_param_position["intercept_r"].get<double>(); param.intercept_pl = connect_param_position["intercept_l"].get<double>(); param.slope_px = connect_param_position["slope_x"].get<double>(); param.slope_py = connect_param_position["slope_y"].get<double>(); param.slope_pr = connect_param_position["slope_r"].get<double>(); param.slope_pl = connect_param_position["slope_l"].get<double>(); param.slope2_px = connect_param_position["slope2_x"].get<double>(); param.slope2_py = connect_param_position["slope2_y"].get<double>(); param.slope2_pr = connect_param_position["slope2_r"].get<double>(); param.slope2_pl = connect_param_position["slope2_l"].get<double>(); }