当前位置: 首页 > news >正文

c++ 使用rapidjson对数据序列化和反序列化(vs2109)

  RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库,综合性能是最好的。

1. 安装

在NuGet中为项目安装tencent.rapidjson

2. 引用头文件

#include <rapidjson/document.h>
#include <rapidjson/memorystream.h>
#include <rapidjson/prettywriter.h>


3. 头文件定义

添加测试json字符串和类型对应数组

// 测试json字符串
const char* strJson = "{\"name\":\"MenAngel\",\"age\":23,\"hobbys\":[\"语文\",\"数学\",\"英语\",54],\"scores\":{\"数学\":\"90.6\",\"英语\":\"100.0\", \"语文\":\"80.0\"}}";// 数据类型,和 rapidjson的enum Type 相对应
static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };

 

4.  修改JSON 内容

/// <summary>
///  修改JSON 内容
/// </summary>
void MyRapidJson::alterJson()
{rapidjson::Document doc;doc.Parse(strJson);cout << "修改前: " << strJson <<"\n" << endl;// 修改内容rapidjson::Value::MemberIterator iter = doc.FindMember("name");if (iter != doc.MemberEnd())doc["name"] = "张三";iter = doc.FindMember("age");if (iter != doc.MemberEnd()){rapidjson::Value& v1 = iter->value;v1 = "40";}// 修改后的内容写入 StringBuffer 中rapidjson::StringBuffer buffer;rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);doc.Accept(writer);cout <<"修改后: " << buffer.GetString() << "\n" << endl;
}

运行结果:

{"name":"张三","age":"40","hobbys":["语文","数学","英语",54],"scores":{"数学":"90.6","英语":"100.0","语文":"80.0"}}

5. 生成 json 数据

/// <summary>
/// 生成JSON数据
/// </summary>
void MyRapidJson::createJson()
{// 1.准备数据string name = "王五";string gender = "boy";int age = 23;bool student = true;vector<string> hobbys = { "语文","数学","英语" };map<string, double> scores = { {"语文",80},{"数学",90},{"英语",100} };//2.初始化DOMrapidjson::Document doc;rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();doc.SetObject();// 添加数据/* 字符串添加 */ rapidjson::Value tempValue1;tempValue1.SetString(name.c_str(), allocator);doc.AddMember("name", tempValue1, allocator);rapidjson::Value tempValue2(rapidjson::kStringType);tempValue2.SetString(gender.c_str(), allocator);doc.AddMember(rapidjson::StringRef("gender"), tempValue2, allocator);/* 数字类型添加 */doc.AddMember("age", age, allocator);/* bool 类型 */rapidjson::Value tempValueStu(rapidjson::kTrueType);tempValueStu.SetBool(student);doc.AddMember(rapidjson::StringRef("student"), tempValueStu, allocator);/* Array 添加数据 */rapidjson::Value tempValue3(rapidjson::kArrayType);for (auto hobby : hobbys){rapidjson::Value hobbyValue(rapidjson::kStringType);hobbyValue.SetString(hobby.c_str(), allocator);tempValue3.PushBack(hobbyValue, allocator);}doc.AddMember("hobbys", tempValue3, allocator);/* Object 添加 */rapidjson::Value tempValue4(rapidjson::kObjectType);tempValue4.SetObject();for (auto score : scores){//rapidjson::Value scoreName(rapidjson::kStringType);//scoreName.SetString(score.first.c_str(), allocator);//tempValue4.AddMember(scoreName, score.second, allocator);// 方法二rapidjson::Value scoreName(rapidjson::kStringType);scoreName.SetString(score.first.c_str(), allocator);rapidjson::Value scoreValue(rapidjson::kStringType);char charValue[20];itoa(score.second, charValue,10);scoreValue.SetString(charValue, allocator);tempValue4.AddMember(scoreName, scoreValue, allocator);}doc.AddMember("scores", tempValue4, allocator);// 写入 StringBufferrapidjson::StringBuffer strBuffer;rapidjson::Writer<rapidjson::StringBuffer> writer(strBuffer);doc.Accept(writer);cout << strBuffer.GetString() << "\n" << endl;string outFileName = "C:\\Users\\Administrator\\Desktop\\creatJson.txt";ofstream outfile(outFileName, std::ios::trunc);outfile << strBuffer.GetString() << endl;outfile.flush();outfile.close(); 
}

运行结果:

{"name":"王五","gender":"boy","age":23,"student":true,"hobbys":["语文","数学","英语"],"scores":{"数学":"90","英语":"100","语文":"80"}}

6. json 数据解析

/// <summary>
/// 查询json 内容
/// </summary>
void MyRapidJson::searchJson()
{rapidjson::Document doc;if (doc.Parse(strJson).HasParseError()){std::cout << "json 解析错误" << std::endl;return;}cout << "doc 的属性成员有 " << doc.MemberCount() << "个!" << endl;vector<string> propertyName;int i = 0;for (rapidjson::Value::MemberIterator iter = doc.MemberBegin(); iter != doc.MemberEnd(); ++iter){cout << ++i << "、 " << iter->name.GetString() << "    is " << kTypeNames[iter->value.GetType()] << endl;propertyName.push_back(iter->name.GetString());}cout << endl;for (rapidjson::Value::MemberIterator iter = doc.MemberBegin(); iter != doc.MemberEnd(); ++iter){if (iter->value.GetType() == rapidjson::kObjectType || iter->value.GetType() == rapidjson::kArrayType)cout << iter->name.GetString() << " : " << endl;else cout << iter->name.GetString() << " : ";DfsDocument(std::move(iter->value));}
}/// <summary>
///  遍历里面的内容
/// </summary>
/// <param name="val"></param>
void MyRapidJson::DfsDocument(rapidjson::Value val)
{if (!val.GetType())return;switch (val.GetType()) {case rapidjson::kNumberType:cout << val.GetInt() << endl;break;case rapidjson::kStringType:cout << val.GetString() << endl;break;case rapidjson::kArrayType:for (rapidjson::Value::ValueIterator itr = val.GetArray().begin();itr != val.GetArray().end(); ++itr) {rapidjson::Value a;a = *itr;DfsDocument(std::move(a));}break;case rapidjson::kObjectType:for (rapidjson::Value::MemberIterator itr = val.GetObject().begin();itr != val.GetObject().end(); ++itr) {cout << itr->name.GetString() << " ";rapidjson::Value a;a = itr->value;DfsDocument(std::move(a));}default:break;}
}

运行结果

这里需要注意: 

object 类型json字符串中,“数字类型” 需转为 “字符串”,否则查询时会报错。

7.  rapidjson 的其他使用方法

/// <summary>
/// json 属性
/// </summary>
void MyRapidJson::JsonAttribute()
{rapidjson::Document doc;if (doc.Parse(strJson).HasParseError()){std::cout << "json 解析错误" << std::endl;return;}// 成员判断if (doc.HasMember("hobbys") && !doc["hobbys"].Empty())cout << "doc[\"hobbys\"] is not empty!" << "\n" << endl;elsecout << "doc[\"hobbys\"] 不存在。" << "\n" << endl;//7.Array的大小if (doc["hobbys"].IsArray()){cout << "doc[\"hobbys\"].Capacity() =  \"  Array的容量及大小:\" " << doc["hobbys"].Capacity() << " 项" << endl;cout << "doc[\"hobbys\"].Size() =  \"  Array的容量及大小:\" " << doc["hobbys"].Size() << " 项" << endl;}// 字符串长度获取cout << doc["name"].GetString()  <<"  字符串长度 :" << doc["name"].GetStringLength() << endl;//4.查询某个成员是否存在rapidjson::Value::MemberIterator iter = doc.FindMember("scores");if (iter != doc.MemberEnd()){cout << iter->name.GetString() << " : " << endl;DfsDocument(std::move(iter->value));}elsecout << "Not Finded!" << endl;// 相同判断if (doc["name"].GetString() == string("MenAngel") &&doc["name"] == "MenAngel" && strcmp(doc["name"].GetString(),"MenAngel") == 0){cout << "判断为相等" << endl;}}

运行结果:

http://www.lryc.cn/news/177402.html

相关文章:

  • 4.迭代最近点ICP及非线性优化求解
  • 【redis总结】
  • 图数据库:释放关系的力量
  • Windows系统如何临时关闭“Windows安全中心实时保护”
  • 二叉树MFC实现
  • Nginx之客户并发数限制解读
  • 白捡一个存储型XSS
  • SpringMVC 学习(五)转发,重定向和传参
  • selenium不定位元素直接使用键盘操作(如弹框操作)
  • Inno Setup安装中文语言
  • 【数据库——MySQL】(10)视图和索引
  • No servers available for service: renren…。 Gateway 网关报503错误 ,已解决
  • 【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现
  • 添加路径到头文件默认搜索路径
  • 掌动智能:替代JMeter的压力测试工具有哪些
  • Casper Network 构建企业级区块链生态的野望
  • TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事
  • Django Web开发入门基础
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)
  • LetCode算法题---第2天
  • Leetcode.2571 将整数减少到零需要的最少操作数
  • 微前端无界 项目使用记录
  • CDH 6.3.2升级Flink到1.17.1版本
  • 基于谷歌Transeformer构建人工智能问答系统
  • 【2023年11月第四版教材】第15章《风险管理》(合集篇)
  • python常见面试题四
  • stm32无人机-飞行力学原理
  • Java括号匹配
  • 自动化测试-友好的第三方库
  • 基于微信小程序的火锅店点餐订餐系统设计与实现(源码+lw+部署文档+讲解等)