当前位置: 首页 > news >正文

【C++】开源:rapidjson数据解析库配置与使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍rapidjson数据解析库配置与使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明
      • 解析json数据示例:
      • 写入json数据示例:
      • 从文件中解析json
      • 将json数据写入文件

😏1. 项目介绍

项目Github地址:https://github.com/Tencent/rapidjson

RapidJSON 是一个快速的 C++ JSON 解析器/生成器,具有高效的内存利用和低延迟。它是一个轻量级的、模块化的、功能齐全的 JSON 库,广泛应用于 C++ 程序中用于处理 JSON 数据。

RapidJSON 的特点包括:

1.快速高效:RapidJSON 通过最大程度地优化内存使用和计算效率来实现快速的 JSON 解析和生成,它在性能上表现出色。

2.标准兼容:RapidJSON 完全符合 JSON 标准(RFC 8259),可以处理各种合法的 JSON 数据。

3.模块化设计:RapidJSON 的设计非常模块化,允许用户根据自己的需求选择性地使用特定的功能模块,从而减少了库的大小和依赖关系。

4.可扩展性:RapidJSON 支持用户自定义分配器来管理内存分配,也支持自定义解析错误处理策略,使其在不同的应用场景下具有很好的灵活性。

5.跨平台:RapidJSON 可以在各种操作系统和编译器上运行,包括 Windows、Linux、macOS 等。

RapidJSON 提供了简单易用的 API,使得解析和生成 JSON 数据变得非常便捷。通过 RapidJSON,你可以轻松地在 C++ 程序中处理 JSON 数据,包括解析 JSON 字符串和构建 JSON 对象。

😊2. 环境配置

下面进行环境配置:

# apt安装
sudo apt install rapidjson-dev
# g++编译不用加 -l

😆3. 使用说明

下面进行使用分析:

解析json数据示例:

#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"

int main() {
    const char* json = R"(
        {
            "name": "John",
            "age": 30,
            "isStudent": true,
            "scores": [85, 90, 88]
        }
    )";

    rapidjson::Document document;
    document.Parse(json);

    if (document.IsObject()) {
        // 提取字符串类型数据
        std::string name = document["name"].GetString();
        std::cout << "Name: " << name << std::endl;

        // 提取整数类型数据
        int age = document["age"].GetInt();
        std::cout << "Age: " << age << std::endl;

        // 提取布尔类型数据
        bool isStudent = document["isStudent"].GetBool();
        std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;

        // 提取数组类型数据
        const rapidjson::Value& scores = document["scores"];
        if (scores.IsArray()) {
            std::cout << "Scores: ";
            for (rapidjson::SizeType i = 0; i < scores.Size(); i++) {
                std::cout << scores[i].GetInt() << " ";
            }
            std::cout << std::endl;
        }
    }

    return 0;
}

写入json数据示例:

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>

int main() {
    rapidjson::Document document;
    document.SetObject();

    // 添加字符串类型数据
    rapidjson::Value name;
    name.SetString("John", document.GetAllocator());
    document.AddMember("name", name, document.GetAllocator());

    // 添加整数类型数据
    rapidjson::Value age;
    age.SetInt(30);
    document.AddMember("age", age, document.GetAllocator());

    // 添加布尔类型数据
    rapidjson::Value isStudent;
    isStudent.SetBool(true);
    document.AddMember("isStudent", isStudent, document.GetAllocator());

    // 添加数组类型数据
    rapidjson::Value scores(rapidjson::kArrayType);
    scores.PushBack(85, document.GetAllocator());
    scores.PushBack(90, document.GetAllocator());
    scores.PushBack(88, document.GetAllocator());
    document.AddMember("scores", scores, document.GetAllocator());

    // 将 Document 对象序列化成 JSON 字符串
    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    document.Accept(writer);

    // 输出 JSON 字符串
    std::cout << buffer.GetString() << std::endl;

    return 0;
}

从文件中解析json

#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"
#include <cstdio>
#include <iostream>

int main() {
    // 打开 JSON 文件
    FILE* fp = fopen("data.json", "r");
    if (fp == nullptr) {
        std::cerr << "Failed to open input.json" << std::endl;
        return 1;
    }

    // 读取文件内容
    char readBuffer[65536];
    rapidjson::FileReadStream is(fp, readBuffer, sizeof(readBuffer));

    // 创建 RapidJSON 解析器
    rapidjson::Document document;
    document.ParseStream(is);

    // 关闭文件
    fclose(fp);

    // 检查解析是否成功
    if (document.HasParseError()) {
        std::cerr << "JSON parse error: " << rapidjson::GetParseErrorFunc(document.GetParseError()) << std::endl;
        return 1;
    }

    // 访问和处理 JSON 数据
    if (document.IsObject()) {
        const rapidjson::Value& name = document["name"];
        const rapidjson::Value& age = document["age"];
        const rapidjson::Value& isStudent = document["isStudent"];

        std::cout << "Name: " << name.GetString() << std::endl;
        std::cout << "Age: " << age.GetInt() << std::endl;
        std::cout << "Is Student: " << (isStudent.GetBool() ? "Yes" : "No") << std::endl;
    } else {
        std::cerr << "JSON is not an object" << std::endl;
        return 1;
    }

    return 0;
}

将json数据写入文件

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include <fstream>

int main() {
    rapidjson::Document document;
    document.SetObject();

    // 添加字符串类型数据
    rapidjson::Value name;
    name.SetString("John", document.GetAllocator());
    document.AddMember("name", name, document.GetAllocator());

    // 添加整数类型数据
    rapidjson::Value age;
    age.SetInt(30);
    document.AddMember("age", age, document.GetAllocator());

    // 添加布尔类型数据
    rapidjson::Value isStudent;
    isStudent.SetBool(true);
    document.AddMember("isStudent", isStudent, document.GetAllocator());

    // 将 Document 对象序列化成 JSON 字符串
    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    document.Accept(writer);

    // 将 JSON 字符串写入文件
    std::ofstream outputFile("output.json");
    if (outputFile.is_open()) {
        outputFile << buffer.GetString();
        outputFile.close();
        std::cout << "JSON data has been written to output.json" << std::endl;
    } else {
        std::cerr << "Failed to open output.json for writing" << std::endl;
    }

    return 0;
}

在这里插入图片描述

以上。

相关文章:

  • 数据结构大体体系
  • 没网络也能安装.Net 3.5!如何脱机安装.NET Framework 3.5
  • 云尘 命令执行系列
  • 配置阿里云镜像加速器 -docker
  • 硬件加速器及其深度神经网络模型的性能指标理解
  • [算法日志]图论: 广度优先搜索(BFS)
  • NtripShare Caster高精度定位CORS服务软件
  • 【实践篇】一次Paas化热部署实践分享 | 京东云技术团队
  • 图像切分:将一张长图片切分为指定长宽的多张图片
  • element-ui 表格 点击选中
  • 中文大语言模型汇总
  • 城市内涝解决方案:实时监测,提前预警,让城市更安全
  • ESXi配置两个不同网段虚拟机互通
  • 考研408-计算机网络 第一章-计算机网络体系结构学习笔记及习题
  • 工具介绍——第三方软件远程连接(工具:Rustdesk)
  • 长短期神经网络LSTM的博文分类,长短期神经网络的原理分析
  • 【开题报告】基于uniapp的在线考试小程序的设计与实现
  • Python武器库开发-常用模块之subprocess模块(十九)
  • 技术分享 | App常见bug解析
  • CVE-2023-34040 Kafka 反序列化RCE
  • 加快推进科技服务业高质量发展,九部门联合发文
  • 慢品巴陵,看总编辑眼中的岳阳如何书写“山水人文答卷”
  • 首次带人形机器人走科技节红毯,傅利叶顾捷:没太多包袱,很多事都能从零开始
  • 张国清将赴俄罗斯举行中俄“长江—伏尔加河”地方合作理事会第五次会议和“东北—远东”政府间合作委员会双方主席会晤
  • 人民日报整版聚焦:外贸产品拓内销提速增量,多地加快推动内外贸一体化
  • 江西3人拟提名为县(市、区)长候选人