C++构造和解析Json的使用示例

C++构造和解析Json的使用示例

简介

Json是一种轻量级的数据交换格式,常用于前后端数据传输、配置文件等。本文将介绍在C++中如何构造和解析Json数据。

Json库

C++中有很多称手的Json库,常用的有:

这些库都提供了简单易用的Api,形式上大同小异,具体使用可以结合文档查询。

以下示例以RapidJson为例进行说明。

构造Json数据

RapidJson提供了Document类型表示Json文档,可以通过以下方式构造Json数据:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"

using namespace rapidjson;

int main() {
    Document doc;
    doc.SetObject();  // 构造一个Object类型的Json

    Value name;
    name.SetString("Alice");
    doc.AddMember("name", name, doc.GetAllocator());

    Value age;
    age.SetInt(20);
    doc.AddMember("age", age, doc.GetAllocator());

    Value interests;
    interests.SetArray();
    Value hobby1, hobby2;
    hobby1.SetString("reading");
    hobby2.SetString("music");
    interests.PushBack(hobby1, doc.GetAllocator());
    interests.PushBack(hobby2, doc.GetAllocator());
    doc.AddMember("interests", interests, doc.GetAllocator());

    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    doc.Accept(writer);

    std::cout << buffer.GetString() << std::endl;
    return 0;
}

以上代码通过向Document对象添加Value类型的成员构造一个Json对象,并将其输出到标准输出流。

输出结果:

{"name":"Alice","age":20,"interests":["reading","music"]}

解析Json数据

解析Json也是同样简单,只需在Document对象上调用Parse()方法,传入Json数据即可。

const char* json = "{\"name\":\"Alice\",\"age\":20,\"interests\":[\"reading\",\"music\"]}";
Document doc;
doc.Parse(json);

std::string name = doc["name"].GetString();
int age = doc["age"].GetInt();
std::vector<std::string> interests;
const Value& interestArray = doc["interests"];
for (SizeType i = 0; i < interestArray.Size(); i++) {
    interests.push_back(interestArray[i].GetString());
}

std::cout << "name: " << name << std::endl;
std::cout << "age: " << age << std::endl;
std::cout << "interests:" << std::endl;
for (const auto& interest : interests) {
    std::cout << "- " << interest << std::endl;
}

以上代码读取一个Json字符串,解析后将数据存储在相应的变量中,并输出到标准输出流。

输出结果:

name: Alice
age: 20
interests:
- reading
- music

示例说明

示例一

假设我们需要在C++程序中读取并处理一个外部服务器的配置文件,文件格式为Json,内容如下所示:

{
    "host": "127.0.0.1",
    "port": 8080,
    "workers": [
        { "name": "worker1", "type": "A", "enabled": true },
        { "name": "worker2", "type": "B", "enabled": false }
    ]
}

其中,host、port为简单类型,workers为数组类型,其元素为具有多个字段的对象类型。

读取并处理该文件的代码如下:

std::ifstream ifs("/path/to/config.json");
std::string json((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());

Document doc;
doc.Parse(json.c_str());

std::string host = doc["host"].GetString();
int port = doc["port"].GetInt();
std::vector<std::string> workerNames;
const Value& workerArray = doc["workers"];
for (SizeType i = 0; i < workerArray.Size(); i++) {
    const Value& worker = workerArray[i];
    if (worker["enabled"].GetBool()) {
        workerNames.push_back(worker["name"].GetString());
    }
}

std::cout << "host: " << host << std::endl;
std::cout << "port: " << port << std::endl;
std::cout << "enabled workers:" << std::endl;
for (const auto& workerName : workerNames) {
    std::cout << "- " << workerName << std::endl;
}

该代码通过读取文件内容,并使用RapidJson解析Json数据,将host、port与所有enabled的worker名称输出到标准输出流。

输出结果:

host: 127.0.0.1
port: 8080
enabled workers:
- worker1

示例二

假设我们需要将一个C++程序计算得到的数据导出为一个Json文件,格式如下:

{
    "input": {
        "n": 10,
        "m": 5
    },
    "output": [
        { "value": 3.14, "note": "result 1" },
        { "value": -0.5, "note": "result 2" }
    ]
}

其中,input为对象类型,包含两个字段;output为数组类型,包含多个对象,其每个对象包含两个字段。

将数据导出为上述Json文件的代码如下:

Document doc;
doc.SetObject();

Value input;
input.SetObject();
input.AddMember("n", 10, doc.GetAllocator());
input.AddMember("m", 5, doc.GetAllocator());
doc.AddMember("input", input, doc.GetAllocator());

Value output;
output.SetArray();
Value result1, result2;
result1.SetObject();
result1.AddMember("value", 3.14, doc.GetAllocator());
result1.AddMember("note", "result 1", doc.GetAllocator());
output.PushBack(result1, doc.GetAllocator());
result2.SetObject();
result2.AddMember("value", -0.5, doc.GetAllocator());
result2.AddMember("note", "result 2", doc.GetAllocator());
output.PushBack(result2, doc.GetAllocator());
doc.AddMember("output", output, doc.GetAllocator());

std::ofstream ofs("/path/to/output.json");
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
ofs << buffer.GetString() << std::endl;

以上代码创建了一个Json文档,并将其输出到指定路径下的Json文件。

结语

本文简单介绍了在C++中如何构造和解析Json数据,以提供开发时参考之用。实际应用中需特别注意文档对象的内存管理问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++构造和解析Json的使用示例 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Win10怎么设置MTU值加快WIFI速度?

    针对“Win10怎么设置MTU值加快WIFI速度?”这个问题,下面是我提供的完整攻略: 1. 了解MTU值 MTU(Maximum Transmission Unit)即最大传输单元,是每个数据包可以传输的最大数据量。通常情况下,MTU值越大,一个数据包就可以携带更多的数据,从而提高网络传输效率。但如果MTU值设置得过大,会增加传输过程中出现网络问题的风险。…

    C 2023年5月22日
    00
  • 详解C++中的万能头文件

    好的。首先让我解释一下什么是万能头文件。 在C++中,头文件是开发者定义新类型、函数和变量的地方。当一个程序中需要使用某些函数或变量时,我们需要包含对应的头文件。万能头文件指的是一些包含了大量库函数和其他头文件信息的头文件,如: #include <iostream> #include <stdio.h> #include <s…

    C 2023年5月23日
    00
  • MySQL中查询json格式的字段实例详解

    MySQL中查询json格式的字段需要使用JSON函数。此处介绍几个常用的MySQL JSON函数。 JSON_EXTRACT JSON_EXTRACT可以用来提取json中的某个值,其语法如下: JSON_EXTRACT(json_obj, path) 其中,json_obj表示json对象,path表示要提取的值的路径。路径可以是简单的key或者是嵌套的…

    C 2023年5月23日
    00
  • #FREERTOS的和heap_4内存分配算法

    FreeRTOS的heap_4内存管理算法具有内存碎片合并的功能,可以有效防止内存碎片产生,使用First fit算法,在实现上与C标准库的malloc类似,但是效率更高且能进行碎片合并回收。以下是个人对源码的解析,有空再补充详细。 一、初始化 static void prvHeapInit( void ) { BlockLink_t *pxFirstFre…

    C语言 2023年4月17日
    00
  • office2003怎么设置R1C1样式?

    当你使用Microsoft Office 2003时,可以选择使用相对参照样式,也就是R1C1样式,而不使用A1样式。下面将为你详细讲解如何设置R1C1样式。 步骤1:进入选项设置 首先打开Microsoft Excel 2003,然后单击工具栏上的“选项”按钮。在弹出的“选项”窗口中,单击“工作表”选项卡。 步骤2:启用R1C1样式选项 在“工作表”选项卡…

    C 2023年5月23日
    00
  • 抖音蓝v认证有什么作用?抖音蓝v认证的好处和坏处分析

    抖音蓝v认证有什么作用? 什么是抖音蓝V认证? 抖音蓝V认证是抖音对于特定领域或人群进行身份验证后授予的官方认证标识,代表着用户在该领域具有一定的知名度和影响力。抖音蓝V认证的标志是一个蓝色“V”字,出现在用户个人资料页上方。 抖音蓝V认证有什么作用? 1. 提升用户信任度 在众多抖音用户中,拥有蓝V认证的用户会比普通用户更容易获得其他用户的信任。因为蓝V认…

    C 2023年5月22日
    00
  • java序列化与反序列化的使用方法汇总

    下面是对“java序列化与反序列化的使用方法汇总”的详细讲解。 什么是Java序列化和反序列化? Java序列化是指将Java对象转换为可存储或可传输格式的过程,也就是将Java对象转换成字节流的过程。Java反序列化则是将字节流转换成Java对象的过程。 Java序列化和反序列化功能被广泛地应用在网络传输和文件存储等场景中。 Java序列化的实现方式 Ja…

    C 2023年5月23日
    00
  • C_936.nls 系统文件丢失或损坏的解决方法

    针对“C_936.nls 系统文件丢失或损坏的解决方法”问题,我提供如下攻略: 问题描述 在使用Windows操作系统时,可能会遇到系统提示“C_936.nls 系统文件丢失或损坏”的错误信息。该文件是Windows系统中的一个文本文件,如果该文件丢失或损坏,可能会导致某些系统功能无法正常运行。 解决方法 方法一:从备份文件中还原 如果你有系统备份文件,可以…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部