rapidjson实战

  • 前言
  • 一、应用
    • 序列化步骤
    • 解析步骤
    • 实战
    • 注意事项

前言

RapidJSON 是一个小、快、独立的 C++ 的 JSON 解析器及生成器,仅由头文件组成。具备如下特点:

  • RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。
  • RapidJSON 快。它的性能可与 strlen() 相比。可支持 SSE2/SSE4.2 加速。
  • RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至不依赖于 STL。
  • RapidJSON 对内存友好。在大部分 32/64 位机器上,每个 JSON 值只占 16 字节(除字符串外)。它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。
  • RapidJSON 对 Unicode 友好。它支持 UTF-8、UTF-16、UTF-32 (大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON 可以在分析一个 UTF-8 文件至 DOM 时,把当中的 JSON 字符串转码至 UTF-16。它也支持代理对(surrogate pair)及 “\u0000”(空字符)。

资源参见:

  1. rapidjson API 网站
  2. rapidjson github 仓库

一、应用

序列化步骤

  1. 创建rapidjson::StringBuffer strBuf实例
  2. 用创建的rapidjson::StringBuffer实例初始化rapidjson::Writer, 如rapidjson::Writerrapidjson::StringBuffer
  3. wirter(strBuf) writer.StartObject()
  4. writer.Key() wirter.Int() …
  5. writer.EndObject()

解析步骤

  1. 创建文档解析对象 rapidjson::Document doc
  2. 判断是否存在解析错误 if(!doc.Parse(str.data()).HasParseError())
  3. 判断待解析字段是否存在 if(doc.HasMember(“Persions”) && doc[“Persions”].IsArray())
  4. 将字段转换成rapidjson::Value引用类型 const rapidjson::Value& array = doc[“Persions”];
  5. 对每一个字段进行解析 如有嵌套的类型应该将嵌套类型转换为rapidjson::Value引用类型后再解析,详见代码

实战

#include"rapidjson/document.h"
#include"rapidjson/stringbuffer.h"
#include"rapidjson/writer.h"#include<vector>
#include<stdio.h>
#include<string>//定义一个结构体 并提供无参构造函数和有参数构造函数 提供init函数
struct Persion {std::string name;int age;std::string team;Persion(){}Persion(std::string p_name, int p_age, std::string p_team){name = p_name;age = p_age;team =p_team;}void init(std::string p_name, int p_age, std::string p_team){name = p_name;age = p_age;team = p_team;}};std::string serialize_persion_vector(std::vector<Persion> vec){rapidjson::StringBuffer strBuf;rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);writer.StartObject();writer.Key("Persions");writer.StartArray();std::vector<Persion>::iterator it;for(it = vec.begin(); it != vec.end(); it++){writer.StartObject();writer.Key("name");writer.String((*it).name.c_str());writer.Key("age");writer.Int((*it).age);writer.Key("team");writer.String((*it).team.c_str());writer.EndObject();}writer.EndArray();writer.EndObject();std::string data = strBuf.GetString();return data;}std::vector<Persion> parse_persion_vector(std::string str){std::vector<Persion> vec;//创建文档解析对象rapidjson::Document doc;//首先进行解析,如过没有解析错误,才能进入下一步具体字段解析if(!doc.Parse(str.data()).HasParseError()){if(doc.HasMember("Persions") && doc["Persions"].IsArray()){//将字段转换成rapidjson::Value引用类型const rapidjson::Value& array = doc["Persions"];size_t len = array.Size();for(int i = 0; i < len; ++i){ //将嵌套的字段转换成rapidjson::Value引用类型const rapidjson::Value& item = array[i];struct Persion persion;//对每一个字段进行解析if(item.HasMember("name") && item["name"].IsString()){persion.name = item["name"].GetString();}else{printf("no name\n");}if(item.HasMember("age") && item["age"].IsInt()){persion.age = item["age"].GetInt();}else{printf("no age\n");}if(item.HasMember("team") && item["team"].IsString()){persion.team = item["team"].GetString();}else{printf("no team\n");}vec.push_back(persion);}}}else{printf("parse error\n");}printf("vec.size():%d\n", (int)vec.size());return vec;}int main(){struct Persion persion1, persion2;persion1.init("James", 33, "Lakers");persion2.init("Paul", 34, "Rockets");std::vector<Persion> persion_vec;persion_vec.push_back(persion1);persion_vec.push_back(persion2);//序列号一个内容为persion 结构体类型的verctorstd::string persion_vector_str = serialize_persion_vector(persion_vec);printf("persion_vector_str:%s\n", persion_vector_str.c_str());//用序列化的结果进行反序列化  验证整个过程是否正确std::vector<Persion> persion_vec2 = parse_persion_vector(persion_vector_str);std::string persion_vector_str2 = serialize_persion_vector(persion_vec2);printf("persion_vector_str2:%s\n", persion_vector_str2.c_str());return 0;
}

注意事项

  • rapidjson相关函数均为单词首字母大写
  • 需要解析的字段必须转换为rapidjson::Value&类型,注意是引用
  • 本实例包含c++语法,编译时使用g++命令

rapidjson实战相关推荐

  1. 购买李宁Cocos2d-x套餐,送最新出的《Cocos2d-x游戏实战指南》签名书一本

    活动时间:2016-10-18至2016-11-30 通过本套餐,可完全了解Cocos2d-x 3.x的相关技术,以及掌握C++语言,并具有一定的项目实战经验. Cocos2d-x游戏开发套餐:htt ...

  2. IDEA的Docker插件实战(Dockerfile篇)

    IDEA的Docker插件实战(Dockerfile篇) IntelliJ IDEA的Docker插件能帮助我们将当前工程制作成Docker镜像.运行在指定的远程机器上,是学习和开发阶段的好帮手,本文 ...

  3. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

  4. 【置顶】利用 NLP 技术做简单数据可视化分析教程(实战)

    置顶 本人决定将过去一段时间在公司以及日常生活中关于自然语言处理的相关技术积累,将在gitbook做一个简单分享,内容应该会很丰富,希望对你有所帮助,欢迎大家支持. 内容介绍如下 你是否曾经在租房时因 ...

  5. 2 用python进行OpenCV实战之图像基本知识

    前言 在这一节,我们将学习图像的基本构成单元--像素,我们将详细的探讨什么是像素?像素是如何使用来构成图像的?然后学习如何通过OpenCV来获取和操纵像素. 1 什么是像素 所有的图像都包含一组像素, ...

  6. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    20210607 https://blog.csdn.net/u011828281/article/details/81171066 前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词 ...

  7. 实战清除电脑上恶意弹出广告窗口

    实战清除电脑上恶意弹出广告窗口 当你碰到电脑桌面右下角时不时弹出广告,如游戏推广.商品广告等,怎么删也删不掉,这是因为用户不小心安装有捆绑广告推广的软件,系统被静默安装了恶意木马广告,这不仅仅是影响用 ...

  8. deeplearning模型量化实战

    deeplearning模型量化实战 MegEngine 提供从训练到部署完整的量化支持,包括量化感知训练以及训练后量化,凭借"训练推理一体"的特性,MegEngine更能保证量化 ...

  9. DeepLabV3+语义分割实战

    DeepLabV3+语义分割实战 语义分割是计算机视觉的一项重要任务,本文使用Jittor框架实现了DeepLabV3+语义分割模型. DeepLabV3+论文:https://arxiv.org/p ...

最新文章

  1. 微生物组—宏基因组分析专题培训开课啦!10月北京
  2. 通过excel模板文件根据数据库数据修改其中的单元格数据
  3. Centos 利用yum源安装 nginx 1.20.1
  4. 安装fastdfs依赖包
  5. Python3中的bytes和str类型
  6. apache2: unrecognized service
  7. html5在线加密,HTML源代码在线加密解密
  8. 牛客网Python篇入门编程习题
  9. kms激活win10
  10. 软件人才应具备的五种素质
  11. 使用CMD打开证书管理实用程序
  12. 中国最大的IDC世纪互联是如何成为云计算时代的看客的
  13. docker redis
  14. OpenGLES2.0后台绘制图片
  15. Python优雅地生成拼图效果
  16. [Elasticsearch]4.可伸缩性解密:集群、节点和分片
  17. MySQL的备份、恢复
  18. Java熔断器比较_线上防雪崩利器——熔断器设计原理与实现
  19. python语言诞生时间_Python语言诞生
  20. 2021年第16届首尔国际电视节圆满落幕

热门文章

  1. dpdk-20.11 rpm包编译
  2. eggs和egg是什么意思_egg是什么意思英语
  3. 昆山有python培训吗
  4. Mscrm电话业务应用
  5. 数据结构:竞标赛排序 原理简单
  6. 用python画函数的梯度图_只需45秒,用Python给故宫画一组雪景手绘图
  7. 上一篇、下一篇之实现思路
  8. linux modprobe自动加载,modprobe 开机自动加载模块的方法 亲测成功
  9. Spring注入(Injection)——教你一点一点知道什么是依赖注入及注入方式
  10. 下辈子,无论爱与不爱,都不会再见