写入:
#include <jsoncpp/json/json.h>
void main(int argc, char **argv) {
Json::Value root;
root["ref_cam_id"] = 0;
Json::Value cam0;
cam0["camera_id"] = 0;
cam0["width"] = 1920;
cam0["height"] = 1080;
cam0["intrinsics"][0] = 1000;
cam0["intrinsics"][1] = 1000;
cam0["intrinsics"][2] = 960;
cam0["intrinsics"][3] = 540;
Json::Value cam1;
cam1["camera_id"] = 1;
cam1["width"] = 1280;
cam1["height"] = 720;
cam1["intrinsics"][0] = 900;
cam1["intrinsics"][1] = 900;
cam1["intrinsics"][2] = 640;
cam1["intrinsics"][3] = 360;
root["cameras"][0] = cam0;
//root["cameras"][1] = cam1;
root["cameras"].append(cam1);
Json::StyledWriter writer;
std::ofstream out_file;
out_file.open("/home/alan/Desktop/test.json");
//out_file << writer.write(root);
out_file << root.toStyledString();
out_file.close();
}
key 默认按照字典排序
读取:
#include <jsoncpp/json/json.h>
void main() {
std::string camera_config_path = "/home/alan/Desktop/test.json";
std::ifstream file(camera_config_path);
if(!file.is_open()) {
std::cout << "Cannot open file " << camera_config_path << std::endl;
}
//Json::Reader reader;
//Json::Value root;
//if (!reader.parse(file, root))
//{
// return -1;
//}
Json::Value root;
Json::CharReaderBuilder builder;
JSONCPP_STRING errs;
bool ok = parseFromStream(builder, file, &root, &errs);
if(!ok) {
std::cout << "Error while parsing json stream: " << errs << std::endl;
}
Json::Value cam0_node = root["cameras"][0];
int width = cam0_node["width"].asInt();
int height = cam0_node["height"].asInt();
Json::Value intrinsics_node = cam0_node["intrinsics"];
if (intrinsics_node.size() != 4) {
std::cout << "error" << std::endl;
}
double fx = intrinsics_node[0].asDouble();
double fy = intrinsics_node[1].asDouble();
double cx = intrinsics_node[2].asDouble();
double cy = intrinsics_node[3].asDouble();
Json::Value cam1_node = root["cameras"][1];
// ...
std::cout << width << " " << height << " " << fx << " " << fy << " " << cx << " " << cy << std::endl;
}
CMakeLists.txt:
find_package(jsoncpp REQUIRED)
include_directories(${JSONCPP_INCLUDE_DIR})
add_executable(main src/main.cpp)
target_link_libraries(main jsoncpp)
json与jsonlines转换:
sudo apt-get install jq
cat test.txt | jq '.' > test.json # json->jsonlines
cat test.json | jq -c '.' > test.txt # jsonlines->json
参考:
JSON, JSONlines, and jq as a better grep
JsonCpp如何判断是否有某个KEY,使用json[“key”]和isXXX的函数即可。
如果json中没有key键,则会创建一个空成员或者返回一个空成员。
bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isUInt() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;