• RapidJson开源库使用


    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.代码示例
    1. #include "funset.hpp"
    2. #include "rapidjson/document.h"
    3. // #include "rapidjson/writer.h"
    4. #include "rapidjson/prettywriter.h"
    5. #include "rapidjson/stringbuffer.h"
    6. #include
    7. #include
    8. #include
    9. #include "common.hpp"
    10. int test_rapidjson_parse()
    11. {
    12. #ifdef _MSC_VER
    13. const char *file_name = "E:/GitCode/Messy_Test/testdata/json.data";
    14. #else
    15. const char *file_name = "testdata/json.data";
    16. #endif
    17. std::ifstream in(file_name);
    18. if (!in.is_open())
    19. {
    20. fprintf(stderr, "fail to read json file: %s\n", file_name);
    21. return -1;
    22. }
    23. std::string json_content((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
    24. in.close();
    25. rapidjson::Document dom;
    26. if (!dom.Parse(json_content.c_str()).HasParseError())
    27. {
    28. if (dom.HasMember("name") && dom["name"].IsString())
    29. {
    30. fprintf(stdout, "name: %s\n", dom["name"].GetString());
    31. }
    32. if (dom.HasMember("address") && dom["address"].IsString())
    33. {
    34. fprintf(stdout, "address: %s\n", utf8_to_gbk(dom["address"].GetString()));
    35. }
    36. if (dom.HasMember("age") && dom["age"].IsInt())
    37. {
    38. fprintf(stdout, "age: %d\n", dom["age"].GetInt());
    39. }
    40. const char *tmp = "xxx";
    41. if (!dom.HasMember(tmp))
    42. {
    43. fprintf(stdout, "Warning: it has no member: %s\n", tmp);
    44. }
    45. if (dom.HasMember("value1") && dom["value1"].IsArray())
    46. {
    47. const rapidjson::Value &arr = dom["value1"];
    48. for (int i = 0; i < arr.Size(); ++i)
    49. {
    50. const rapidjson::Value &tmp = arr[i];
    51. fprintf(stdout, "value1:\ni = %d:", i);
    52. for (int j = 0; j < tmp.Size(); ++j)
    53. {
    54. if (tmp[j].IsInt())
    55. fprintf(stdout, "%d, ", tmp[j].GetInt());
    56. if (tmp[j].IsFloat())
    57. fprintf(stdout, "%.1f, ", tmp[j].GetFloat());
    58. }
    59. fprintf(stdout, "\n");
    60. }
    61. }
    62. if (dom.HasMember("value2") && dom["value2"].IsArray())
    63. {
    64. const rapidjson::Value &arr = dom["value2"];
    65. fprintf(stdout, "value2: ");
    66. for (int i = 0; i < arr.Size(); ++i)
    67. {
    68. fprintf(stdout, "%.2f, ", arr[i].GetFloat());
    69. }
    70. fprintf(stdout, "\n");
    71. }
    72. if (dom.HasMember("bei_jing") && dom["bei_jing"].IsObject())
    73. {
    74. const rapidjson::Value &obj = dom["bei_jing"];
    75. if (obj.HasMember("address") && obj["address"].IsString())
    76. {
    77. fprintf(stdout, "address: %s\n", utf8_to_gbk(obj["address"].GetString()));
    78. }
    79. if (obj.HasMember("car") && obj["car"].IsBool())
    80. {
    81. fprintf(stdout, "car: %d\n", obj["car"].GetBool());
    82. }
    83. if (obj.HasMember("cat") && obj["cat"].IsBool())
    84. {
    85. fprintf(stdout, "cat: %d\n", obj["cat"].GetBool());
    86. }
    87. }
    88. if (dom.HasMember("shan_dong") && dom["shan_dong"].IsObject())
    89. {
    90. const rapidjson::Value &obj = dom["shan_dong"];
    91. if (obj.HasMember("address") && obj["address"].IsString())
    92. {
    93. fprintf(stdout, "address: %s\n", utf8_to_gbk(obj["address"].GetString()));
    94. }
    95. if (obj.HasMember("value1") && obj["value1"].IsArray())
    96. {
    97. const rapidjson::Value &arr = obj["value1"];
    98. if (arr[0].HasMember("ji_nan") && arr[0]["ji_nan"].IsString())
    99. {
    100. fprintf(stdout, "ji_nan: %s\n", utf8_to_gbk(arr[0]["ji_nan"].GetString()));
    101. }
    102. if (arr[0].HasMember("tai_an") && arr[0]["tai_an"].IsString())
    103. {
    104. fprintf(stdout, "tai_an: %s\n", utf8_to_gbk(arr[0]["tai_an"].GetString()));
    105. }
    106. }
    107. }
    108. }
    109. else
    110. {
    111. fprintf(stderr, "fail to parse json file: %s\n", file_name);
    112. return -1;
    113. }
    114. // iter json
    115. for (rapidjson::Value::ConstMemberIterator iter = dom.MemberBegin(); iter != dom.MemberEnd(); ++iter)
    116. {
    117. fprintf(stdout, "iter json name: %s, type: %d\n", iter->name.GetString(), iter->value.GetType());
    118. }
    119. return 0;
    120. }
    121. int test_rapidjson_write()
    122. {
    123. rapidjson::StringBuffer buf;
    124. // rapidjson::Writer writer(buf);
    125. rapidjson::PrettyWriter writer(buf); // it can word wrap
    126. writer.StartObject();
    127. writer.Key("name");
    128. writer.String("spring");
    129. writer.Key("address");
    130. writer.String("北京");
    131. writer.Key("age");
    132. writer.Int(30);
    133. writer.Key("value1");
    134. writer.StartArray();
    135. writer.StartArray();
    136. writer.Double(23);
    137. writer.Double(43);
    138. writer.Double(-2.3);
    139. writer.Double(6.7);
    140. writer.Double(90);
    141. writer.EndArray();
    142. writer.StartArray();
    143. writer.Int(-9);
    144. writer.Int(-19);
    145. writer.Int(10);
    146. writer.Int(2);
    147. writer.EndArray();
    148. writer.StartArray();
    149. writer.Int(-5);
    150. writer.Int(-55);
    151. writer.EndArray();
    152. writer.EndArray();
    153. writer.Key("value2");
    154. writer.StartArray();
    155. writer.Double(13.3);
    156. writer.Double(1.9);
    157. writer.Double(2.10);
    158. writer.EndArray();
    159. writer.Key("bei_jing");
    160. writer.StartObject();
    161. writer.Key("address");
    162. writer.String("海淀");
    163. writer.Key("car");
    164. writer.Bool(false);
    165. writer.Key("cat");
    166. writer.Bool(true);
    167. writer.EndObject();
    168. writer.Key("shan_dong");
    169. writer.StartObject();
    170. writer.Key("address");
    171. writer.String("济南");
    172. writer.Key("value1");
    173. writer.StartArray();
    174. writer.Key("ji_nan");
    175. writer.String("趵突泉");
    176. writer.Key("tai_an");
    177. writer.String("泰山");
    178. writer.EndArray();
    179. writer.EndObject();
    180. writer.EndObject();
    181. const char *json_content = buf.GetString();
    182. fprintf(stdout, "json content: %s\n", json_content);
    183. #ifdef _MSC_VER
    184. const char *file_name = "E:/GitCode/Messy_Test/testdata/out.json";
    185. #else
    186. const char *file_name = "testdata/out.json";
    187. #endif
    188. std::ofstream outfile;
    189. outfile.open(file_name);
    190. if (!outfile.is_open())
    191. {
    192. fprintf(stderr, "fail to open file to write: %s\n", file_name);
    193. return -1;
    194. }
    195. outfile << json_content << std::endl;
    196. outfile.close();
    197. return 0;
    198. }

    json文件内容如下所示:

    1. {
    2. "name": "spring",
    3. "address": "北京",
    4. "age": 30,
    5. "value1": [
    6. [
    7. 23,
    8. 43,
    9. -2.3,
    10. 6.7,
    11. 90
    12. ],
    13. [
    14. -9,
    15. -19,
    16. 10,
    17. 2
    18. ],
    19. [
    20. -5,
    21. -55
    22. ]
    23. ],
    24. "value2": [
    25. 13.3,
    26. 1.9,
    27. 2.10
    28. ],
    29. "bei_jing": {
    30. "address": "海淀",
    31. "car": false,
    32. "cat": true
    33. },
    34. "shan_dong": {
    35. "address": "济南",
    36. "value1": [
    37. {
    38. "ji_nan": "趵突泉"
    39. },
    40. {
    41. "tai_an": "泰山"
    42. }
    43. ]
    44. }
    45. }

  • 相关阅读:
    大数据:Shell的操作
    Camera Tuning 术语
    Kafka多语言版本
    微信客户管理与营销
    共赴开源路,共筑新丰碑!2022云栖大会龙蜥操作系统峰会圆满落幕!
    亚马逊高级API申请
    Java核心知识经典面试题来啦(基础语法篇)
    yolov5+车辆重识别【附代码】
    【TypeScript】接口类型与类型别名:这两者的用法与区别分别是什么?
    1、密码学
  • 原文地址:https://blog.csdn.net/weixin_55238862/article/details/136274473