json库——jsoncpp

一、jsoncpp简介

JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object
Notation)数据格式。JSON是一种轻量级的数据交换格式,广泛用于各种应用程序和网络服务中。

JsonCpp提供了简单和易用的API,可以方便地解析JSON字符串并将其转换为C++对象,同时也可以将C++对象序列化为JSON字符串。它支持标准的JSON语法,并提供了许多功能,如访问和修改JSON对象的属性、数组操作、遍历等。

JsonCpp库的主要特点包括:

轻量级:JsonCpp具有很小的代码体积和低的内存占用,因此非常适合嵌入式系统或资源受限的环境。

跨平台:JsonCpp可以在多种操作系统上运行,包括Windows、Linux、Mac等。

简单易用:JsonCpp提供了简洁的API,使得解析和生成JSON数据变得非常容易。开发人员可以通过简单的函数调用来实现JSON数据的读取、修改和生成。

高性能:JsonCpp采用了高效的算法和数据结构,提供了快速的JSON解析和生成功能。

可靠稳定:JsonCpp经过广泛的测试和使用,已经成为一个成熟的库。它具有良好的稳定性和可靠性,可以处理各种复杂的JSON数据结构

二、下载源码

https://github.com/open-source-parsers/jsoncpp
首先阅读下面的README.md,主要看这句、合并源,我们可以点击这个链接进去
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated- (Possibly-outdated)

Amalgamated source
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated-(Possibly-outdated)

阅读一下这段话,也可以翻译一下
json库——jsoncpp_第1张图片

将JsonCpp集成到您的项目中的一种方法是将汇总的源代码(一个.cpp文件和两个.h文件)包含在您的项目中,并像编译和构建其他源文件一样进行编译和构建。这样可以确保编译标志的一致性和ABI兼容性,这些问题在构建共享库或静态库时会出现。下面的部分提供了详细的说明。

将include/目录添加到您的编译器包含路径中。您可以按照以下方式包含JsonCpp头文件:

#include 

如果在Windows上将JsonCpp构建为动态库,则项目需要定义宏JSON_DLL。

生成汇总的源代码和头文件JsonCpp提供了一个脚本用于生成单个头文件和单个源文件,以便于包含到现有项目中。可以通过从顶层目录运行以下命令随时生成汇总的源代码(需要Python3.4+):

 python amalgamate.py

您可以指定头文件名。有关详细信息,请参阅-h选项。

默认情况下,将生成以下文件:

dist/jsoncpp.cpp:需要添加到您的项目中的源文件。
dist/json/json.h:用于在项目中使用的相应头文件。与在非汇总源代码中包含json/json.h相当。此头文件仅依赖于标准头文件。
dist/json/json-forwards.h:提供所有JsonCpp类型的前向声明的头文件。汇总的源代码是通过按正确的顺序连接JsonCpp源代码并定义宏JSON_IS_AMALGAMATION来生成的,以防止包含其他头文件。

大概意思就是如果我们要是jsonCpp的库,实际上就是需要将jsoncpp.cpp,json.h,json-forwards.h添加到我们的项目当中。
那我们怎么样获得这三个文件?

json库——jsoncpp_第2张图片

下载后找到下面文件
json库——jsoncpp_第3张图片
在当前目录下打开终端,执行下面的命令

python amalgamate.py

json库——jsoncpp_第4张图片
你就可以在当前目录下找到dist目录,里面就有我们需要的三个文件
json库——jsoncpp_第5张图片
我们终于可以使用它了

三、具体应用

Json格式简介

JSON(JavaScript Object
Notation)是一种轻量级的数据交换格式,常用于在不同系统之间传输和存储数据。它具有以下特点:

可读性:JSON使用文本格式表示数据,易于阅读和理解。它采用了类似于JavaScript对象的键值对的形式来组织数据。

简洁性:JSON的语法非常简洁,相比于其他数据格式(如XML),它的数据表示更为紧凑,节省了传输和存储空间。

支持多种数据类型:JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组、对象和null。这使得JSON非常灵活,可以表示各种类型的数据结构。

易于解析和生成:JSON数据可以轻松地由各种编程语言解析和生成。许多编程语言都提供了内置的JSON解析器和生成器,使得处理JSON数据变得简单和方便。

跨平台和语言无关:由于JSON是一种通用的数据格式,它不依赖于任何特定的平台或编程语言。这意味着JSON可以在不同的系统和不同的编程语言之间进行数据交换和共享。

可扩展性:JSON支持嵌套结构,允许在对象中嵌套其他对象或数组,从而实现复杂的数据结构。这种嵌套结构可以实现数据的层级关系和组织。

平台无关的数据交换格式:由于JSON的广泛支持和普及性,它已成为一种通用的数据交换格式。许多Web服务和API都使用JSON作为数据交换的标准格式。

基本示例

{
  "name": "John",
  "age": 18,
  "isStudent": true,
  "hobbies": ["runing", "traveling"],
  "address": {
    "street": "999 Main St",
    "city": "hangzhou"
  }
}

上述示例表示一个包含个人信息的JSON对象。它包括名称、年龄、是否是学生、兴趣爱好和地址等属性。注意JSON中使用双引号表示键和字符串值,使用逗号分隔不同的键值对,使用方括号表示数组,使用花括号表示对象

基本语法:

①.Json 键值对:键值对是 Json 的基本构成。其中,名称即对象的属性名称,必须包含在双引号( " " )中;值即对象对应的属性值;名称和值之间用冒号( : )隔开。
②.Json 值:Json 的值可以是以下几种:字符串、数字( 整型、浮点型 )、布尔值( ture、false )、空值( null )、数组、对象。
③.Json 对象:Json 对象是用大括号( {、} )括起来的一系列 Json 键值对的集合,键值对之间用逗号( , )隔开。
④.Json 数组:Json 数组是用中括号( [、] )括起来的一系列 Json 值的集合,值之间用逗号( , )隔开。

json2str

std::string json2str(const Json::Value &v, bool needFormat)
{
    if (needFormat)
    {
        Json::StreamWriterBuilder writer;
        std::string jsonString = Json::writeString(writer, v);
        return jsonString;
    }
    else
    {
        Json::FastWriter fastWriter;
        return fastWriter.write(v);
    }
}

str2json

bool str2json(const std::string &str, Json::Value &v)
{
    Json::CharReaderBuilder readerBuilder;
    std::istringstream iss(str);

    std::string errs;
    bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &v, &errs);
    if (!parsingSuccessful)
    {
        std::cout << "Failed to parse JSON: " << errs << std::endl;
        return false;
    }

    return true;
}

str2file

bool str2file(const std::string &path, const std::string &data)
{
    std::ofstream file(path);
    if (!file.is_open())
    {
        return false;
    }

    file << data;
    file.close();

    return true;
}

file2json

bool file2json(const std::string &file, Json::Value &v)
{
    std::ifstream inputFile(file);
    if (!inputFile.is_open())
    {
        std::cout << "Failed to open file: " << file << std::endl;
        return false;
    }

    Json::CharReaderBuilder readerBuilder;
    std::string errs;

    bool parsingSuccessful = Json::parseFromStream(readerBuilder, inputFile, &v, &errs);
    inputFile.close();

    if (!parsingSuccessful)
    {
        std::cout << "Failed to parse JSON: " << errs << std::endl;
        return false;
    }

    return true;
}

main

int main()
{
    // 创建一个Json::Value对象
    Json::Value root;
    Json::Value rootaddress;

    // 添加数据到Json对象
    root["name"] = "xiaolan";              // 字符串
    root["age"] = 18;                      // 数字
    root["isStudent"] = true;              // bool类型
    Json::Value hobbies(Json::arrayValue); // 创建包含兴趣爱好的 JSON 数组
    hobbies.append("running");
    hobbies.append("traveling");
    root["hobbies"] = hobbies;

    Json::Value address; // 创建嵌套的 JSON 对象
    address["street"] = "321 Main St";
    address["city"] = "hangzhou";
    root["address"] = address;
    std::cout << "root: " << root << std::endl;

    // 生成 JSON 字符串
    std::string jsonString = json2str(root, true); // 转换为带格式的 JSON 字符串
    std::cout << "带格式jsonString: " << jsonString << std::endl;

    jsonString = json2str(root, false); // 转换为紧凑的 JSON 字符串
    std::cout << "紧凑jsonString: " << jsonString << std::endl;

    // 字符串变为json
    std::string jsonString1 = "{\"address\":{\"city\":\"hangzhou\",\"street\":\"999 Main St\"},\"age\":18,\"hobbies\":[\"running\",\"traveling\"],\"isStudent\":true,\"name\":\"xiaolan\"}";
    Json::Value root1;
    if (str2json(jsonString, root1))
    {
        std::cout << "root1: " << root1 << std::endl;
        // JSON 解析成功,可以访问解析后的数据
        // std::string name = root1["name"].asString();
        // int age = root1["age"].asInt();
        // bool isStudent = root1["isStudent"].asBool();
        // std::string street = root1["address"]["street"].asString();
        // std::string city = root1["address"]["city"].asString();

        // std::cout << "Name: " << name << std::endl;
        // std::cout << "Age: " << age << std::endl;
        // std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;
        // std::cout << "Street: " << street << std::endl;
        // std::cout << "City: " << city << std::endl;
    }

    // 字符串写入文件
    str2file("tempfile.json", json2str(root1, true));

    // 从文件当中读出来JSON
    std::string filePath = "tempfile.json";

    Json::Value root2;

    if (file2json(filePath, root2))
    {
        std::cout << "root2: " << root2 << std::endl;
        // JSON 解析成功,可以访问解析后的数据
        // std::string name = root2["name"].asString();
        // int age = root2["age"].asInt();
        // bool isStudent = root2["isStudent"].asBool();
        // std::string street = root2["address"]["street"].asString();
        // std::string city = root2["address"]["city"].asString();

        // std::cout << "Name: " << name << std::endl;
        // std::cout << "Age: " << age << std::endl;
        // std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;
        // std::cout << "Street: " << street << std::endl;
        // std::cout << "City: " << city << std::endl;
    }
    return 0;
}

参考:
最新版 JsonCpp 的下载、编译、及使用

你可能感兴趣的:(嵌入式,json,linux,c++)