RapidJSON简介及使用

RapidJSON简介及使用RapidJSON 是腾讯开源的一个高效的 C JSON 解析器及生成器 它是只有头文件的 C 库 RapidJSON 是跨平台的 支持 Windows Linux MacOSX 及 iOS Android 它的源码在 https github com Tencent rapidjson 稳定版本为 2016 年发布的 1 1 0 版本 RapidJSON 特点 1 RapidJSON 小而

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 
  
    #include 
   
     #include 
    
      #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 
     
       (in)), std::istreambuf_iterator 
      
        ()); 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 
       
         writer(buf); rapidjson::PrettyWriter 
        
          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.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.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的执行结果如下:与实际结果一致

RapidJSON简介及使用

test_rapidjson_write的执行结果如下:与预期一致,将rapidjson::Writer

writer(buf)调整为rapidjson::PrettyWriter

writer(buf);可使结果自动换行

RapidJSON简介及使用

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200075.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:35
下一篇 2026年3月20日 上午11:35


相关推荐

  • 用递归方法求n的阶乘【C语言实现】

    用递归方法求n的阶乘【C语言实现】#include<stdio.h>intmain(){ longfac(intn); intn,y; printf(“inputanintegernumber:”); scanf(“%d”,&n); y=fac(n); printf(“%d!=%ld\n”,n,y); return0;}longfac(intn){ l…

    2022年5月4日
    87
  • windows cmd命令大全及详解_win10 cmd命令

    windows cmd命令大全及详解_win10 cmd命令命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。在不同的操作系统环境下,命令提示符各不相同。在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于Windows上的命令解释程序,类似于微软的DOS操作系统。一、启动CMD命令提示符控制器“开始”→“运行”→输入“cmd”回车;或者:win+R(两个键同时按)打开“运行”窗口→输…

    2026年2月12日
    6
  • dump日志分析工具

    dump日志分析工具mat 不需要安装 eclipse 独立运行 https www eclipse org mat downloads php

    2026年3月16日
    1
  • 特征金字塔池化

    特征金字塔池化1 特征金字塔池化如上图所示 将特征图的所有像素划分为 n nn timesnn n 个网格 并将其经过核为 n nn timesnn n 步长为 n n n n n n 的池化 可以选择最大池化或者平均池化 经过较为密集的池化 4 times4 形成 形成 形成 N timesC timesn timesn 的特征图 将其串联形成的特征图 将其串联形成的特征图 将其串联形成 C times 的格式 之后 在第 2 个步骤池化得到的特征图的基础上 取不同的 nnn 值 进行下一个池

    2025年10月28日
    6
  • 科大讯飞位列央国企大模型解决方案市场份额第一

    科大讯飞位列央国企大模型解决方案市场份额第一

    2026年3月14日
    2
  • Springboot+druid数据库连接池使用「建议收藏」

    Springboot+druid数据库连接池使用「建议收藏」1.为什么要使用数据库连接池使用数据库连接池主要考虑到程序与数据库建立连接的性能。创建一个新的数据库是一个很耗时的过程,在使用完之后,可能还需要不断的释放建立的连接,对资源的损耗大。而采用数据库连接池之后,首先就创建了固定数量的数据库连接,需要用的时候使用即可。当然,这样做的一个缺点是,可能某些时候完全没有数据库请求,但是也保持了数据库的最小连接数。浪费了…

    2025年11月25日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号