【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;
}

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/122620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VS Code+DevChat助力非专业开发也能玩转代码编程

一、前言 偶然间网上瞎逛&#xff0c;看到DevChat 发布了一款 VS Code 插件&#xff0c;可提供类似chatgpt一样的“一站式 AI 辅助编程”体验。据说&#xff0c; DevChat 直接对接 GPT-4 还让免费用&#xff0c;目前免费注册收邮件即可获取key&#xff0c;再也不用麻烦的外部手…

web3 从redux中拿出所有已完成订单 并渲染到对应的Table列表中

上文web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中 中 我们已经从 区块中拿到了自己的订单 然后 我们恢复一下上文的环境 ganache ganache -d然后 登一下 MetaMask 然后 用我们的项目 发布一下合约 truffle migrate --reset然后…

使用Streamlit创建AutoGen用户界面

AutoGen作为一个最大化LLM(如GPT-4)能力的框架而脱颖而出。由微软研究院开发的AutoGen通过提供一种自动化、优化和编排工作流的方法&#xff0c;简化了复杂的、基于多代理llm的应用程序的创建。我们在以前的文章中也有过介绍&#xff0c;你可以与许多GPT交谈&#xff0c;并且GP…

STM32独立看门狗(IWDG)溢出时间计算

什么是IWDG&#xff1f; 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动&#xff0c;即使主时钟发生故障它也仍然有效。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外&#xff0c;能够完全独立工作&#xff0c;并且对时间精度要求较低的场合。 从上图我们可以看出IWDG的时…

每日一练 | 华为认证真题练习Day127

1、如图所示&#xff0c;关于OSPF的拓扑和配置&#xff0c;下列说法中正确的是&#xff08;&#xff09;。 A. R1与R2相比&#xff0c;R2更有机会成为DR&#xff0c;因为它的接口DR优先级值较小 B. 只要把R1的接口网络类型恢复为默认的广播类型&#xff0c;R1和R2即可建立稳定…

Netty入门指南之NIO 粘包与半包

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题产…

xcode SDK does not contain ‘libarclite‘

SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target解决方法 iOS13以上

多语言翻译软件 Mate Translate mac中文版特色功能

Mate Translate for Mac是一款多语言翻译软件&#xff0c;Mate Translate mac可以帮你翻译超过100种语言的单词和短语&#xff0c;使用文本到语音转换&#xff0c;并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版特色功能…

由于flutter_app依赖于flutter_swiper>=0.0.2,不支持零安全,版本解决失败。

参考 dart3.0使用flutter_swiper报错记录 flutter_swiper package - All Versions从官网的信息可以看到 Dart3版本不兼容 最小兼容的Dart SDK版本需要2.0 Flutter SDK 版本列表Flutter SDK 版本列表 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 说明&#xff1a;因…

骨传导运动蓝牙耳机推荐,这五款骨传导耳机不要错过!

骨传导耳机在这两年在运动圈中非常火热&#xff0c;相比传统耳机&#xff0c;骨传导耳机使用时开放双耳&#xff0c;不堵塞耳朵&#xff0c;解决了入耳式耳机佩戴的不适感。同时&#xff0c;也避免了戴耳机运动时耳内出汗带来的一系列卫生和健康问题。最关键的是通过耳骨传声&a…

汽车标定技术(八)--MPC57xx是如何支持标定的页切换

目录 1.页切换的概念 1.1 标定常量的理解 1.2 页切换 2.MPC57xx的Overlay模块 3.小结 1.页切换的概念 在汽车标定测量中&#xff0c;有一个概念我想很多人都听过&#xff0c;但是实际上在项目里没有用到过&#xff0c;那就是今天要讲的页切换概念。在讲页切换的时候&#…

高防CDN与高防服务器:谁更胜一筹?

在当今数字化世界中&#xff0c;网络安全对于保护网站和应用程序至关重要。在这一背景下&#xff0c;高防CDN和高防服务器是两种流行的解决方案&#xff0c;用于应对不同类型的网络攻击。本文将分析高防CDN是否能够替代高防服务器&#xff0c;以及它们各自的优势和限制。 高防C…

海思SD3403/SS928开发板 开发记录二: 设置网络 telnet连接开发板

1.设置网络 设置桥接网络 并修改虚拟机IP网段 问题1.参照前一篇博客 2.ping 测试 主机 虚拟机 板端 相互通信 3.telnet 登录板端

《泰山众筹火爆全网,小额投资也能成就泰山伟业》

众筹模式好做吗&#xff1f;我们可以看到电商行业内最先吃螃蟹的那几个众筹平台结局都不大体面。不是平台操盘手被抓&#xff0c;就是平台崩盘&#xff0c;总之&#xff0c;传统的众筹卖货模式的风险性已经深植人心。 众筹卖货真就那么难玩吗&#xff1f;其实并非如此&#xff…

RFID电力资产全周期智能化管理应用解决方案

电力行业需求 国家电网提出了建设“泛在电力物联网”的计划&#xff0c;旨在利用现代信息技术和先进通信技术&#xff0c;实现电力系统各环节的万物互联&#xff0c;构建一个具备全面感知、高效处理和便捷灵活特征的智慧服务系统&#xff0c;其中&#xff0c;重点方向之一是围…

【数据结构】链表经典OJ题,常见几类题型(一)

目录 题型一&#xff1a;反转单链表思路解析OJ题实例解题代码 题型二&#xff1a;快慢指针思路解析OJ题实例解题代码 两类题型的结合 题型一&#xff1a;反转单链表 思路解析 反转一个链表主要是想让第一个节点指向NULL&#xff0c;第二个节点指向第一个&#xff0c;以此类推。…

电影《二手杰作》观后感

上周看了电影《二手杰作》,在看电影的时候&#xff0c;自己感觉其实多少有些文艺范&#xff0c;或者有些尴尬的&#xff0c;但是在电影里还好&#xff0c;不过整个故事看下来&#xff0c;多少有点代入感&#xff0c;不多但还是有点。 故事情节&#xff0c;比较简单&#xff0c…

一文带您了解云渲染

很多刚刚接触云渲染的网友可能还不太了解云渲染&#xff0c;不知道云渲染是什么&#xff0c;不知道如何选择云渲染&#xff0c;不知道云渲染怎么收费&#xff0c;今天小编归纳总结了一些网友比较关心的问题&#xff0c;在本文中一一为大家解答。 云渲染是什么&#xff1f; 云…

kubectl 资源管理命令-陈述式

目录 一、kubectl陈述式资源管理&#xff1a; 二、kubectl陈述式对象管理&#xff1a; 1.基础命令使用&#xff1a; 1.1 帮助手册&#xff1a; 1.2 查看版本信息&#xff1a; ​编辑 1.3 查看资源对象简写: 1.4 查看集群信息: 1.5 配置kubectl自动补全: 1.6 node节点查看日志…

南昌大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;https://src.sjtu.edu.cn/ 兑换价格&#xff1a;20金币 获取条件&#xff1a;南昌大学任意中危或以上级别漏洞