jsoncpp库的编译与使用

环境介绍

  操作系统:Windows11_22H2(版本22621.1194)
  编辑器:VS Code
  编译器:g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
  编译工具:cmake version 3.21.0-rc1

jsoncpp库的编译

  jsoncpp的源码地址https://github.com/open-source-parsers/jsoncpp
  将源码下载,然后使用mingw进行编译,过程如下所示:

编译环境及工具简介

  在Windows平台下使用mingw和cmake进行编译,使用的软件为VS Code,搭配其C++插件、cmake插件等完成编译。使用VS Code创建和编译cmake工程的方法戳这里

配置CMakeLists.txt

  使用VS Code打开源码的目录,然后在CMakeLists.txt上点击右键,选择配置所有项目,如果需要选择kit,可以根据自己的需要进行选择,我这里选择的是mingw。如果配置正常,那么就会在目录中创建build文件夹。

编译安装

  根据个人需要选择编译类型(默认为Debug模式,便于后续开发中的调试,也可以改为Release模式),然后选择编译项目为install,再点击Build按钮进行安装:

  如果显示编译正常结束,退出代码为0表示已经编译完成,如下所示:

编译结果说明

  install的安装编译结果下,以.a为后缀的静态链接库存放在C:/Program Files (x86)/jsoncpp/lib/目录中,以.dll为后缀的动态库存放在C:/Program Files (x86)/jsoncpp/bin/目录中,头文件存放在C:/Program Files (x86)/jsoncpp/include/目录中。可以将这些目录添加到对应的工程中,或者直接将这些目录拷贝到自己的工程中。
  注意:.dll结尾的动态运行库需要添加到系统环境变量的PATH中,或者直接将其和项目的可执行文件放在同一层目录中。

jsoncpp库的使用

  jsoncpp的使用参考了源码中的示例代码,并进行了一定的更改。同时,为了方便组织文件目录,采用了以下的文件结构:

│  CMakeLists.txt
│  test.json
│
├─include
│  └─json
│          allocator.h
│          assertions.h
│          config.h
│          forwards.h
│          json.h
│          json_features.h
│          reader.h
│          value.h
│          version.h
│          writer.h
│
├─lib
│      libjsoncpp.a
│      libjsoncpp.dll.a
│
└─src
       readFromStream.cpp
       readFromString.cpp
       streamWrite.cpp
       stringWrite.cpp

  其一,jsconcpp的动态库路径已经加入系统环境变量了。
  其二,工程中的CMakeLists.txt内容如下所示:

cmake_minimum_required(VERSION 3.15)
project(UseJsonCPP LANGUAGES CXX)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)

set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME}_readFromStream src/readFromStream.cpp)
target_link_libraries(${PROJECT_NAME}_readFromStream jsoncpp)

add_executable(${PROJECT_NAME}_readFromString src/readFromString.cpp)
target_link_libraries(${PROJECT_NAME}_readFromString jsoncpp)

add_executable(${PROJECT_NAME}_streamWrite src/streamWrite.cpp)
target_link_libraries(${PROJECT_NAME}_streamWrite jsoncpp)

add_executable(${PROJECT_NAME}_stringWrite src/stringWrite.cpp)
target_link_libraries(${PROJECT_NAME}_stringWrite jsoncpp)

readFromStream

  该示例的作用是从一个文件流中读取json数据,然后输出到屏幕上,使用的json文件内容和源码如下所示:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.18362.0",
            "compilerPath": "D:/Software/mingw64/bin/g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

  源文件:

#include <fstream>
#include <iostream>

#include "json/json.h"
int main(int argc, char* argv[]) {
    Json::Value root;
    std::ifstream ifs;
    // 从一个json文件中读取数据并输出到屏幕,路径请根据自己的文件路径修改
    ifs.open("D://third_part_lib//jsconCPP_test//test.json");

    Json::CharReaderBuilder builder;
    builder["collectComments"] = true;
    JSONCPP_STRING errs;
    if (!parseFromStream(builder, ifs, &root, &errs)) {
        std::cout << errs << std::endl;
        return EXIT_FAILURE;
    }
    std::cout << root << std::endl;
    return EXIT_SUCCESS;
}

  运行结果:

{
        "configurations" : 
        [
                {
                        "cStandard" : "c17",
                        "compilerPath" : "D:/Software/mingw64/bin/g++.exe",
                        "cppStandard" : "c++17",
                        "defines" : 
                        [
                                "_DEBUG",
                                "UNICODE",
                                "_UNICODE"
                        ],
                        "includePath" : 
                        [
                                "${workspaceFolder}/**"
                        ],
                        "intelliSenseMode" : "windows-gcc-x64",
                        "name" : "Win32",
                        "windowsSdkVersion" : "10.0.18362.0"
                }
        ],
        "version" : 4
}

streamWrite

  该示例的作用是将一组json格式的数据输出到标准输出流std::cout中,源码如下所示:

#include <iostream>
#include <memory>

#include "json/json.h"
int main() {
    Json::Value root;
    Json::StreamWriterBuilder builder;
    const std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());

    root["Name"] = "robin";
    root["Age"] = 20;
    writer->write(root, &std::cout);

    return EXIT_SUCCESS;
}

  运行结果:

{
        "Age" : 20,
        "Name" : "robin"
}

readFromString

  该示例的作用是将字符串表示的json格式数据进行解析并输出显示,源码如下所示:

#include <iostream>
#include <memory>

#include "json/json.h"
int main() {
    const std::string rawJson = R"({"Age": 20, "Name": "colin"})";
    const auto rawJsonLength = static_cast<int>(rawJson.length());
    constexpr bool shouldUseOldWay = false;
    JSONCPP_STRING err;
    Json::Value root;

    if (shouldUseOldWay) {
        Json::Reader reader;
        reader.parse(rawJson, root);
    } else {
        Json::CharReaderBuilder builder;
        const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
        if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root,
                           &err)) {
            std::cout << "error" << std::endl;
            return EXIT_FAILURE;
        }
    }
    const std::string name = root["Name"].asString();
    const int age = root["Age"].asInt();

    std::cout << name << std::endl;
    std::cout << age << std::endl;
    return EXIT_SUCCESS;
}

  运行结果:

colin
20

stringWrite

  该示例的作用是将一组json格式的数据转换成string字符串,然后打印到屏幕上,源码如下所示:

#include <iostream>

#include "json/json.h"
int main() {
    Json::Value root;
    Json::Value data;
    constexpr bool shouldUseOldWay = false;
    root["action"] = "run";
    data["number"] = 1;
    root["data"] = data;

    if (shouldUseOldWay) {
        Json::FastWriter writer;
        const std::string json_file = writer.write(root);
        std::cout << json_file << std::endl;
    } else {
        Json::StreamWriterBuilder builder;
        const std::string json_file = Json::writeString(builder, root);
        std::cout << json_file << std::endl;
    }
    return EXIT_SUCCESS;
}

  运行结果:

{
        "action" : "run",
        "data" : 
        {
                "number" : 1
        }
}

当珍惜每一片时光~