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

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

时间:2023-04-04 22:33:09浏览次数:56  
标签:const Json jsoncpp JSON 文件格式 JsonCpp include root

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 <iostream>
#include <memory>

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 <iostream>

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++ ..

标签:const,Json,jsoncpp,JSON,文件格式,JsonCpp,include,root
From: https://www.cnblogs.com/nbtech/p/use_jsoncpp_library.html

相关文章

  • swift tabview 带参数请求网络。多条目展示。json解析,逃逸闭包
    效果:用到的第三方#Uncommentthenextlinetodefineaglobalplatformforyourprojectplatform:ios,'9.0'target'News'do#Commentthenextlineifyoudon'twanttousedynamicframeworksuse_frameworks!#PodsforNewsp......
  • Springboot JSON整合—官方原版
    SpringBoot提供与三个JSON映射库的集成:GsonJacksonJSON-BJackson是首选和默认库。一、Jackson提供了Jackson的自动配置,Jackson是springbootstarterjson的一部分。当Jackson在类路径上时,会自动配置一个ObjectMapperbean。提供了几个配置财产,用于自定义ObjectMapper的配置。1.......
  • 第九章:json操作
    第十章json操作目录第十章json操作一、Marshal序列化二、Unmarshal反序列化1已知数据解析2未知数据解析3json测试一、Marshal序列化packagemainimport( "encoding/json" "fmt")typeAnimalstruct{ Namestring`json:"name"` Orderstring`json:"order"......
  • 使用Newtonsoft.Json在Net6中设置时间格式(含T/不含T)
    实例一:JsonSerializerSettingsjsonSettings=newJsonSerializerSettings{DateFormatString="yyyy-MM-ddHH:mm:ss.fff",};Modelmodel=newModel{CreatedAt=DateTime.UtcNow};......
  • fastjson 把json字符串转成对象
    Stringjson="[{\"fid\":0,\"id\":1,\"name\":\"fjk的测试类目一级\"},{\"fid\":1,\"id\":2,\"name\":\"fjk的测试类目二级\"},{\"fid\":88,\"id\":98,\&q......
  • Jackson_json转换工具
                         ......
  • 要用好json,掌握好json的类型
    SON是用于Web上数据交换的最广泛使用的数据格式。它完全独立于语言。基于JavaScript编程语言的一个子集,易于理解和生成。那json的数据类型有哪些?接下来我们就来给大家讲解一下这方面的内容。JSON主要支持6种数据类型:字符串(String):JSON字符串必须用双引号编写,如C语言,JSON中有各......
  • JSON的创建格式和常用方法
       ......
  • site-packages/flask/json/init.py from future import annotations future feature a
    如果在使用Flask库时,出现了“futurefeatureannotationsisnotdefined”的错误,可能是因为Python解释器版本太低。在Python3.7及以下版本中,from__future__importannotations是不支持的,因此需要升级到Python3.8或更高版本。如果升级Python解释器版本不可行,可以......
  • 两种方式自定制基于JWT的认证类BaseAuthentication和BaseJSONWebTokenAuthentication
    1.基于BaseAuthentication的自定义方法  2.views中调用自定义方法MyJwtAuthentication验证  3.基于BaseAuthentication的自定义方法测试:token过期  4.基于BaseAuthentication的自定义方法测试:token数据有错误,需检查token正确性  5.基于BaseAuthenticati......