• JsonCpp JSON格式处理库的介绍和使用(面向业务编程-文件格式处理)


    JsonCpp JSON格式处理库的介绍和使用(面向业务编程-文件格式处理)

    介绍

    JSON是一种轻量级的数据交换格式,它是一种键值对的集合。它的值可以是数字、字符串、布尔值、序列。

    想知道更多有关JSON格式的介绍,可以到JSON的官网json.org学习

    JsonCpp是一个c++库,允许对JSON值进行操作,包括对字符串的序列化和反序列化。它还可以在反序列化/序列化步骤中保存现有注释,使其成为存储用户输入文件的方便格式。

    Github地址:jsoncpp

    使用实例

    JsonCpp相对于其他的JSON解析库,它的好处就是非常的容易使用

    因为它有一个非常好的特性:下标访问(包括array类型)

        const std::string name = root["Name"].asString();
        const int age = root["Age"].asInt();
    

    上述代码中,Name字段在JSON中是一个String类型,然后通过解析后的root(Json::Value对象)的下标访问

    实际上通过重写下标操作符[]实现

    读取解析读取string

    读取一个JSON格式的string,代码如下

    #include "json/json.h"
    #include 
    #include 
    
    int readJsonExample() {
        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;
    }
    int main() {
        return readJsonExample();
    }
    

    可以看到上面没有使用oldway去解析,新的方法采用CharReaderBuilder生成Reader,其实新的解析写法和之前没有很大的不一样

    输出

    colin
    20
    

    从原始数据构建JSON并序列化

    #include "json/json.h"
    #include 
    
    int writeJsonString() {
        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;
    }
    int main() {
        return writeJsonString();
    }
    

    可以看到差不多,其实可以直接理解为访问对象的下标,然后把实际的数值放进去,JsonCpp会自动判断等号右边的类型。很直观,也比较容易理解

    输出

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

    以库的形式添加到项目中

    本文为作者原创文章,引用请注明出处:https://www.cnblogs.com/nbtech/p/use_jsoncpp_library.html

    mkdir UseJsonCppProject && cd UseJsonCppProject
    git clone https://github.com/open-source-parsers/jsoncpp.git
    vim CMakeLists.txt
    

    CMakeLists.txt内容如下

    cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
    project(jsoncpp-test LANGUAGES CXX)
    
    # jsoncpp
    include_directories(jsoncpp/include)
    add_subdirectory(jsoncpp lib)
    
    # executable output
    add_executable(jt main.cpp)
    target_link_libraries(jt jsoncpp_lib)
    

    这里解释一下前面两行声明项目,include_directories是包含jsoncpp的头文件,add_subdirectory是添加jsoncpp工程本身的CMakeLists.txt到当前目录下,最后两行是添加可执行文件还有将jsoncpp库链接到可执行文件

    add_executable需要加到add_subdirectory的下面

    main.cpp文件可以使用上面的示例

    写完之后创建目录并编译

    # https://www.cnblogs.com/nbtech/p/use_jsoncpp_library.html
    mkdir build && cd build
    cmake .. && make
    

    在我们项目中,用CMake添加jsoncpp库操作如上

    交叉编译?

    有时候我们希望它可以跨平台,那么只需要在cmake配置的时候指定交叉编译工具即可

    cmake -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..
    

    __EOF__

  • 本文作者: Kevin
  • 本文链接: https://www.cnblogs.com/nbtech/p/use_jsoncpp_library.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    基于Monkey的稳定性测试
    Python字典
    Maven的安装与配置(详细版)
    TS的安装及使用时遇到的问题
    1013;温度表达转换
    自动驾驶公交车第 1 部分:车辆运营技术要求
    《ElementPlus 与 ElementUI 差异集合》el-button 属性 type=“text“ 被删除
    Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
    关于springboot的优雅停机和健康检查配置(用于k8s服务重启)
    leetcode 118. 杨辉三角-java实现
  • 原文地址:https://www.cnblogs.com/nbtech/p/use_jsoncpp_library.html