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 <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简介及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LIVE555简介及在Windows上通
- 下一篇: LIVE555中RTSP客户端接收媒体流