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日

相关文章

  • C语言指针的图文详解

    C语言指针的图文详解 什么是指针 在C语言中,指针是一种特殊的数据类型,它存储的是一个内存地址,该内存地址指向存储在内存中的另外一个变量的值。可以将指针看作一种工具,它可以用来操作内存中的数据,让程序更加灵活和高效。 如何声明指针 在C语言中声明指针需要使用星号(*)符号。例如,下面的代码定义了一个名为“ptr”的指向整数变量的指针: int *ptr; 上…

    C 2023年5月22日
    00
  • C#连接Oracle数据库的多种方法总结

    C#连接Oracle数据库的多种方法总结 在C#开发过程中,连接Oracle数据库是一个经常需要面对的问题。本文总结了多种连接Oracle数据库的方法,以供大家参考。 方法一:使用Oracle客户端 这是最经典的连接Oracle数据库的方法。在此之前需要安装Oracle的客户端,下载地址可以在Oracle官网上找到。 使用步骤如下: 在Visual Stud…

    C 2023年5月22日
    00
  • 用C语言实现井字棋游戏代码

    用C语言实现井字棋游戏代码 1. 程序框架 首先,我们需要理解井字棋游戏的规则,然后设计程序框架。井字棋通常是由两个玩家交替下棋,棋盘为 3×3 的矩阵,玩家通过落子来使自己的棋子连成一条直线。因此,我们需要至少维护以下信息: 棋盘状态,即每个位置的落子情况; 游戏进程状态,即当前轮到哪个玩家下棋,或者游戏是否结束。 接下来,我们可以设计井字棋程序的结构体,…

    C 2023年5月24日
    00
  • C/C++从零开始的cmake教程

    下面是C/C++从零开始的CMake教程的完整攻略: 1 概述 CMake是一个非常流行的跨平台的构建系统,它能够自动生成Makefile或者Visual Studio等工具所需要的工程文件。 相信大家对Makefile都不陌生,如果要手动写Makefile,需要一定的经验和技巧,很容易出错,而且维护成本比较高。 而CMake则是一个更加高级的工具,它的语法…

    C 2023年5月23日
    00
  • c++ 探讨奶牛生子的问题

    C++ 探讨奶牛生子的问题 问题描述 有 $N$ 只奶牛,每个奶牛的繁殖周期为 $M$ 年,每只奶牛出生后第 $1$ 年不生育,第 $2$ 年起每年生下一只小奶牛,小奶牛出生后第 $1$ 年也不能生育,第 $2$ 年起也可以生下一只小奶牛。假设所有的奶牛都没有死亡,请问 $T$ 年后一共有多少只奶牛? 解题思路 本题可以采用递归或者动态规划的方式进行求解。我…

    C 2023年5月23日
    00
  • C语言实现求最大公约数的三种方法

    C语言实现求最大公约数的三种方法 最大公约数是指两个或多个整数共有约数中的最大值。下面我们将介绍 C 语言实现求最大公约数的三种方法。 1.辗转相减法 辗转相减法的基本思想是用大数减去小数,然后再用得出的差值去减小的数,这样一直操作,直到所减两数相等。 代码如下: int gcd(int x, int y) { while(x != y) { if(x &g…

    C 2023年5月22日
    00
  • win10环境下C++ vs2015编译opencv249的教程

    以下是“win10环境下C++ vs2015编译opencv249的教程”的完整攻略。 准备工作 下载安装 VS2015 首先,需要下载并安装 Visual Studio 2015,可以通过微软官网下载,或者通过电脑管家等软件下载。 下载安装 CMake 其次,需要下载并安装 CMake。同样可以通过官网下载。 下载安装 Opencv 2.4.9 最后,需要…

    C 2023年5月23日
    00
  • C语言实现简易文本编辑器

    C语言实现简易文本编辑器攻略 1. 需求概述 本项目的目标是使用C语言实现一个简易的文本编辑器,能够实现以下基本功能: 读取文本文档并将其显示在屏幕上。 在文档中插入、删除字符及行。 将编辑后的文档保存至本地。 2. 设计思路 为了实现上述功能,我们考虑按照以下步骤执行: 读取文本文档并将其显示在屏幕上:使用C语言的文件操作方式读取文档内容,然后通过标准输出…

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