RapidJson开源库使用

news2024/9/22 4:32:49
1.下载
GitHub - Tencent/rapidjson: A fast JSON parser/generator for C++ with both SAX/DOM style APIA fast JSON parser/generator for C++ with both SAX/DOM style API - Tencent/rapidjsonicon-default.png?t=N7T8https://github.com/Tencent/rapidjson

官方使用手册:RapidJSON: 首页(中文版)

2.RapidJson简介

RapidJSON特点:

(1)RapidJSON小而全:它同时支持SAX和DOM风格的API,SAX解析器只有约500行代码。

(2) RapidJSON快:它的性能可与strlen()相比,可支持SSE2/SSE4.2加速,使用模版及内联函数去降低函数调用开销。

(3)RapidJSON独立:它不依赖于BOOST等外部库,它甚至不依赖于STL。

(4)RapidJSON对内存友好:在大部分32/64位机器上,每个JSON值只占16字节(除字符串外),它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。

(5)RapidJSON对Unicode友好:它支持UTF-8、UTF-16、UTF-32(大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON可以在分析一个UTF-8文件至DOM (Document Object Model, 文件对象模型)时,把当中的JSON字符串转码至UTF-16。它也支持代理对(surrogate pair)及"\u0000"(空字符)。

每个JSON值都储存为Value类,而Document类则表示整个DOM,它存储了一个DOM 树的根Value。RapidJSON的所有公开类型及函数都在rapidjson命名空间中。

3.加载RapidJson库

在项目中只需要将 include/rapidjson 目录复制至系统或项目的 include 目录中。

4.代码示例
#include "funset.hpp"
#include "rapidjson/document.h"
// #include "rapidjson/writer.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include <fstream>
#include <string>
#include "common.hpp"

int test_rapidjson_parse()
{
#ifdef _MSC_VER
    const char *file_name = "E:/GitCode/Messy_Test/testdata/json.data";
#else
    const char *file_name = "testdata/json.data";
#endif
    std::ifstream in(file_name);
    if (!in.is_open())
    {
        fprintf(stderr, "fail to read json file: %s\n", file_name);
        return -1;
    }

    std::string json_content((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
    in.close();

    rapidjson::Document dom;
    if (!dom.Parse(json_content.c_str()).HasParseError())
    {
        if (dom.HasMember("name") && dom["name"].IsString())
        {
            fprintf(stdout, "name: %s\n", dom["name"].GetString());
        }

        if (dom.HasMember("address") && dom["address"].IsString())
        {
            fprintf(stdout, "address: %s\n", utf8_to_gbk(dom["address"].GetString()));
        }

        if (dom.HasMember("age") && dom["age"].IsInt())
        {
            fprintf(stdout, "age: %d\n", dom["age"].GetInt());
        }

        const char *tmp = "xxx";
        if (!dom.HasMember(tmp))
        {
            fprintf(stdout, "Warning: it has no member: %s\n", tmp);
        }

        if (dom.HasMember("value1") && dom["value1"].IsArray())
        {
            const rapidjson::Value &arr = dom["value1"];
            for (int i = 0; i < arr.Size(); ++i)
            {
                const rapidjson::Value &tmp = arr[i];

                fprintf(stdout, "value1:\ni = %d:", i);
                for (int j = 0; j < tmp.Size(); ++j)
                {
                    if (tmp[j].IsInt())
                        fprintf(stdout, "%d, ", tmp[j].GetInt());
                    if (tmp[j].IsFloat())
                        fprintf(stdout, "%.1f, ", tmp[j].GetFloat());
                }
                fprintf(stdout, "\n");
            }
        }

        if (dom.HasMember("value2") && dom["value2"].IsArray())
        {
            const rapidjson::Value &arr = dom["value2"];

            fprintf(stdout, "value2: ");
            for (int i = 0; i < arr.Size(); ++i)
            {
                fprintf(stdout, "%.2f, ", arr[i].GetFloat());
            }
            fprintf(stdout, "\n");
        }

        if (dom.HasMember("bei_jing") && dom["bei_jing"].IsObject())
        {
            const rapidjson::Value &obj = dom["bei_jing"];

            if (obj.HasMember("address") && obj["address"].IsString())
            {
                fprintf(stdout, "address: %s\n", utf8_to_gbk(obj["address"].GetString()));
            }

            if (obj.HasMember("car") && obj["car"].IsBool())
            {
                fprintf(stdout, "car: %d\n", obj["car"].GetBool());
            }

            if (obj.HasMember("cat") && obj["cat"].IsBool())
            {
                fprintf(stdout, "cat: %d\n", obj["cat"].GetBool());
            }
        }

        if (dom.HasMember("shan_dong") && dom["shan_dong"].IsObject())
        {
            const rapidjson::Value &obj = dom["shan_dong"];

            if (obj.HasMember("address") && obj["address"].IsString())
            {
                fprintf(stdout, "address: %s\n", utf8_to_gbk(obj["address"].GetString()));
            }

            if (obj.HasMember("value1") && obj["value1"].IsArray())
            {
                const rapidjson::Value &arr = obj["value1"];

                if (arr[0].HasMember("ji_nan") && arr[0]["ji_nan"].IsString())
                {
                    fprintf(stdout, "ji_nan: %s\n", utf8_to_gbk(arr[0]["ji_nan"].GetString()));
                }

                if (arr[0].HasMember("tai_an") && arr[0]["tai_an"].IsString())
                {
                    fprintf(stdout, "tai_an: %s\n", utf8_to_gbk(arr[0]["tai_an"].GetString()));
                }
            }
        }
    }
    else
    {
        fprintf(stderr, "fail to parse json file: %s\n", file_name);
        return -1;
    }

    // iter json
    for (rapidjson::Value::ConstMemberIterator iter = dom.MemberBegin(); iter != dom.MemberEnd(); ++iter)
    {
        fprintf(stdout, "iter json name: %s, type: %d\n", iter->name.GetString(), iter->value.GetType());
    }

    return 0;
}

int test_rapidjson_write()
{
    rapidjson::StringBuffer buf;
    // rapidjson::Writer<rapidjson::StringBuffer> writer(buf);
    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf); // it can word wrap

    writer.StartObject();

    writer.Key("name");
    writer.String("spring");
    writer.Key("address");
    writer.String("北京");
    writer.Key("age");
    writer.Int(30);

    writer.Key("value1");
    writer.StartArray();
    writer.StartArray();
    writer.Double(23);
    writer.Double(43);
    writer.Double(-2.3);
    writer.Double(6.7);
    writer.Double(90);
    writer.EndArray();

    writer.StartArray();
    writer.Int(-9);
    writer.Int(-19);
    writer.Int(10);
    writer.Int(2);
    writer.EndArray();

    writer.StartArray();
    writer.Int(-5);
    writer.Int(-55);
    writer.EndArray();
    writer.EndArray();

    writer.Key("value2");
    writer.StartArray();
    writer.Double(13.3);
    writer.Double(1.9);
    writer.Double(2.10);
    writer.EndArray();

    writer.Key("bei_jing");
    writer.StartObject();
    writer.Key("address");
    writer.String("海淀");
    writer.Key("car");
    writer.Bool(false);
    writer.Key("cat");
    writer.Bool(true);
    writer.EndObject();

    writer.Key("shan_dong");
    writer.StartObject();
    writer.Key("address");
    writer.String("济南");
    writer.Key("value1");
    writer.StartArray();
    writer.Key("ji_nan");
    writer.String("趵突泉");
    writer.Key("tai_an");
    writer.String("泰山");
    writer.EndArray();
    writer.EndObject();

    writer.EndObject();

    const char *json_content = buf.GetString();
    fprintf(stdout, "json content: %s\n", json_content);

#ifdef _MSC_VER
    const char *file_name = "E:/GitCode/Messy_Test/testdata/out.json";
#else
    const char *file_name = "testdata/out.json";
#endif
    std::ofstream outfile;
    outfile.open(file_name);
    if (!outfile.is_open())
    {
        fprintf(stderr, "fail to open file to write: %s\n", file_name);
        return -1;
    }

    outfile << json_content << std::endl;
    outfile.close();

    return 0;
}

json文件内容如下所示:

{
    "name": "spring",
    "address": "北京",
    "age": 30,
    "value1": [
        [
            23,
            43,
            -2.3,
            6.7,
            90
        ],
        [
            -9,
            -19,
            10,
            2
        ],
        [
            -5,
            -55
        ]
    ],
    "value2": [
        13.3,
        1.9,
        2.10
    ],
    "bei_jing": {
        "address": "海淀",
        "car": false,
        "cat": true
    },
    "shan_dong": {
        "address": "济南",
        "value1": [
            {
                "ji_nan": "趵突泉"
            },
            {
                "tai_an": "泰山"
            }
        ]
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

码上飞:免费制作自己的ChatBot

今天为大家介绍一款可以免费制作ChatBot的软件开发平台&#xff0c;码上飞CodeFlying&#xff0c;只需几步&#xff0c;即可完成ChatBot的开发&#xff0c;并且支持自定义添加自己的知识库&#xff01; 第一步&#xff1a;访问官网&#xff1a;码上飞 CodeFlying | AI 智能软件…

SpringMVC 学习(一)之 SpringMVC 介绍

目录 1 MVC 介绍 2 SpringMVC 介绍 2.1 SpringMVC 特点 2.2 SpringMVC 的核心组件 2.3 SpringMVC 执行流程 3 参考文档 1 MVC 介绍 MVC (Model View Controller) 是一种设计思想&#xff0c;它将应用程序分为三大组件&#xff1a;模型 (Model)、视图 (View)、控制器 (Con…

群晖NAS DSM7.2.1安装宝塔之后无法登陆账号密码问题解决

宝塔的安装就不在这赘述了&#xff0c;只说下&#xff0c;启动之后默认账号密码无法登陆的问题。 按照上面给出的账号密码&#xff0c;无法登陆 然后点忘记密码&#xff0c;由于是docker安装的&#xff0c;根目录下没有/www/server/panel 。 也没有bt命令 要怎么修改呢。 既然…

go使用trpc案例

1.go下载trpc go install trpc.group/trpc-go/trpc-cmdline/trpclatest 有报错的话尝试配置一些代理&#xff08;选一个&#xff09; go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://goproxy.io,direct go env -w GOPROXYhttps://goproxy.baidu.com/…

[面试] 如何保证Redis和MySQL数据一致性?

为什么要在Redis存数据 Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据 库 IO&#xff0c;还可以提升数据的 IO 性能。 因为Redis基于内存, 查询效率比MySQL快很多, 所以有限查询Redis中的数据,如果Redis没有就查询数据库然后同步到Redis 出…

算法-两两交换链表中的节点

1、题目来源 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交…

【C++】内存分配 | 内存管理 | new和delete | 内存泄漏

目录 1. C/C内存分布 2. C语言中动态内存管理方式 3. C内存管理方式 3.1 new操作内置类型 3.2 new自定义类型 4. operator new函数 5. new和delete的实现原理 5.1 内置类型 5.2 自定义类型 6. 定位new表达式 7. 常见面试题 7.1 malloc/free和new/delete的区别 7.2…

【C++STL】STL容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

JVM(1)

JVM简介 JVM是Java Virtual Machine的简称,意为Java虚拟机. 在java中,它归属于jre(java运行时环境), 而jre归属于jdk(java开发工具包). 虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统. 常见的虚拟机:JVM, VMwave, VirtualBox. J…

什么是SSD型云服务器?

​  SSD云服务器是一种使用固态硬盘代替传统HDD进行存储的虚拟机。SDD 使用闪存单元来存储数据&#xff0c;与云计算技术相结合&#xff0c;形成强大且高效的存储解决方案&#xff0c;可以随时随地访问。 SSD云服务器如何工作? SSD云服务器是利用虚拟化和云计算技术创建的。…

抖音数据抓取工具|视频内容提取软件

引言部分&#xff1a; 介绍针对抖音视频下载需求开发的强大工具突出解决用户获取抖音视频繁琐问题的初衷 工具功能介绍&#xff1a; 详细描述工具功能&#xff0c;包括关键词搜索、自动批量抓取、选择性批量下载等提及基于C#开发的优势以及支持通过分享链接进行单个视频抓取…

eureka 简介和基本使用

Eureka 是Netflix开发的服务发现框架&#xff0c;是Spring Cloud微服务架构中的一部分。它主要用于微服务架构中的服务注册与发现。Eureka由两部分组成&#xff1a;Eureka Server 和 Eureka Client。获取更详细的信息可以访问官网&#xff0c;如下图&#xff1a; Eureka Server…

使用uniapp实现小程序获取wifi并连接

一、背景 因业务需求&#xff0c;需要在小程序实现发现wifi和连接wifi。但由于Andriod和IOS有差异&#xff0c;所以实现起来有所区别。 先看官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/device/wifi.html 把连接基础流程了解后&#xff0c;发现二者…

EasyRecovery2024高级完整个人版免费下载使用

该软件的高级功能和功能选项主要包括以下几个方面&#xff1a; 恢复删除的磁盘分区&#xff1a;EasyRecovery能够快速扫描磁盘&#xff0c;寻找并恢复删除的磁盘分区&#xff0c;无需检索完整磁盘扇区。支持主流的MBR和GPT分区类型&#xff0c;实现安全可靠的分区恢复。恢复格…

pythonJax小记(五):python: 使用Jax深度图像(正交投影和透视投影之间的转换)(持续更新,评论区可以补充)

python: 使用Jax深度图像&#xff08;正交投影和透视投影之间的转换&#xff09; 前言问题描述1. 透视投影2. 正交投影 直接上代码解释1. compute_projection_parameters 函数a. 参数解释b. 函数计算 2. ortho_to_persp 函数a. 计算投影参数&#xff1a;b. 生成像素坐标网格&am…

《Python 语音转换简易速速上手小册》第10章 未来趋势和发展方向(2024 最新版)

文章目录 10.1 语音技术的未来展望10.1.1 基础知识10.1.2 主要案例:语音驱动的虚拟助理案例介绍案例 Demo案例分析10.1.3 扩展案例 1:情感敏感的客服机器人案例介绍案例 Demo案例分析10.1.4 扩展案例 2:多模态智能会议系统案例介绍案例 Demo

Linux-用户和权限(黑马学习笔记)

认识root用户 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 ● 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; ● 而在前期&#xff0c;我们一直…

SpringBoot 3 新特性

目录 1. GraalVM2. 支持虚拟线程3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件&#xff0c;可以显著提升启动速度、峰值性能以及减少内存应用。传统的应用都是编译成字节码&#xff0c;然后通过JVM解释并最终编译成机器码来运行&a…

报错:org.springframework.jdbc.BadSqlGrammarException:

//报错 2024-02-24 19:44:10.814 ERROR 6184 --- [nio-9090-exec-5] c.e.exception.GlobalExceptionHandler : 异常信息&#xff1a; org.springframework.jdbc.BadSqlGrammarException: GPT&#xff1a; 根据异常信息&#xff0c;这是一个Spring框架抛出的BadSqlGrammar…

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了&#xff01;&#xff01;&#xff01;金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;总部位于中国深圳市&#xff0c;兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析…