User Tools

Site Tools


programming:cpp:json

JSON

JSON は JavaScript Object Notation 記法のこと.
人間にも機械にもそれなりの可読性を持ったファイル形式である.

JSON ファイルを C++ で読み込むにはいくつかの方法があるが,ここでは picojson を紹介する.

  • GitHub から picojson.h を持ってくる
  • ヘッダオンリーライブラリなので適当なところに picojson.h を置けば使える
  • sample code
{
  "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
  }
}
TestPicojson.cpp
#include "picojson.h"
#include <boost/filesystem.hpp>
#include <fstream>
 
namespace fs = boost::filesystem;
 
void ReadJsonData(t2l_param &param, 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>();
 
}
programming/cpp/json.txt · Last modified: 2022/04/11 14:23 by odagawa