RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在https://github.com/Tencent/rapidjson/,稳定版本为2016年发布的1.1.0版本。

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命名空间中。

以上内容摘自:http://rapidjson.org/zh-cn/,关于RapidJSON的更详细介绍可以参考此网页。

以下是测试代码(test_rapidjson.cpp):

#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_VERconst char* file_name = "E:/GitCode/Messy_Test/testdata/json.data";
#elseconst char* file_name = "testdata/json.data";
#endifstd::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 jsonfor (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 wrapwriter.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.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_VERconst char* file_name = "E:/GitCode/Messy_Test/testdata/out.json";
#elseconst char* file_name = "testdata/out.json";
#endifstd::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.data内容如下:

{"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": "泰山"}]}
}

test_rapidjson_parse的执行结果如下:与实际结果一致

test_rapidjson_write的执行结果如下:与预期一致,将rapidjson::Writer<rapidjson::StringBuffer> writer(buf)调整为rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf);可使结果自动换行

GitHub:https://github.com/fengbingchun/Messy_Test

RapidJSON简介及使用相关推荐

  1. hiredis和rapidjson库的使用小结

    Hiredis 简介 Hiredis 是Redis官方发布的C版本客户端 hiredis库.redis的源码中也有使用hiredis.比如redis-cli和Redis中的哨兵机制和主从机制,集群等都 ...

  2. rapidjson安装学习

    这里主要记录几个要点,后面来补充吧,很晚了 源码是鹅厂大佬写的,佩服佩服~ 一.RapidJSON介绍及资料 RapidJSON是腾讯开源的C++ JSON解析及生成器,只有头文件的C++库,跨平台. ...

  3. JSON--rapidjson介绍

    JSON--rapidjson 1 RapidJSON简介 2 C/C++ Json库对比 一致性 解析时间 解析内存 Stringify Time(string 2 json) Prettify T ...

  4. RapidJSON v1.1.0 发布简介

    时隔 15.6 个月,终于发布了一个新版本 v1.1.0. 新版本除了包含了这些日子收集到的无数的小改进及 bug fixes,也有一些新功能.本文尝试从使用者的角度,简单介绍一下这些功能和沿由. P ...

  5. rapidjson官方教程

    原文地址:http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html 教程 目录 Value 及 Document 查询Value 查询Array 查 ...

  6. jsoncpp和rapidjson哪个好用?

    作者:Milo Yip 链接:http://www.zhihu.com/question/23654513/answer/46157616 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非 ...

  7. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  8. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  9. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

最新文章

  1. ORACLE 内部原理
  2. COM域名难逃实名监管 CN域名简化流程抢用户
  3. 一步一步写算法(之图的保存)
  4. nodejs模块hashmap
  5. bzoj 1027: [JSOI2007]合金(floyd最小环)
  6. 【渝粤教育】国家开放大学2018年春季 7392-22DMatlab语言及其应用 参考试题
  7. 使用阿里矢量图标库操作流程
  8. BP神经网络预测matlab程序销售量预测
  9. 阅读《http权威指南》
  10. 基于javaSwing、MySQL的酒店客房管理系统(附源码)
  11. JavaScript封装回调函数(委托)
  12. 裁员取暖?互联网行业深陷寒冬,网易被爆裁员30%!
  13. 基于EasyX使用Wu反走样算法画线
  14. C# WPF MVVM 实战 - 2.1
  15. 【论文翻译】Many-Class Few-Shot Learning on Multi-Granularity Class Hierarchy
  16. 淘宝前端工程师:国内WEB前端开发十日谈
  17. 软件工程专业计算机毕设选题推荐
  18. [CTFSHOW]中期测评WP(差512和514)
  19. 绿盟于旸:让阿里安娜火箭爆炸的缓冲区溢出 linkboy语录:tk出品必是精品呵呵
  20. Conversion failed when converting date and/or time from character string.

热门文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款数字骰子
  2. 少样本学习原理快速入门,并翻译《Free Lunch for Few-Shot Learning: Distribution Calibration》
  3. keras 的 example 文件 antirectifier.py 解析
  4. Linux那些事儿之我是Sysfs(10)sysfs 创建目录
  5. Linux那些事儿之我是Sysfs(2)linux设备底层模型
  6. HDU - 3183 A Magic Lamp 线段树
  7. linux 删除含有关键词的文件_误删除Linux系统文件了?这个方法教你解决
  8. Udacity机器人软件工程师课程笔记(十六)-机械臂仿真控制实例(其一)-Gazebo、RViz和Moveit!
  9. UE商城资源 Kitsune狐狸女孩
  10. slub object 内存布局