json文件读写

写入:

#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 默认按照字典排序

json文件读写

读取:

#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::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)