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

这篇具有很好参考价值的文章主要介绍了c++ 使用rapidjson对数据序列化和反序列化(vs2109)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1. 安装

在NuGet中为项目安装tencent.rapidjson

c++ 使用rapidjson对数据序列化和反序列化(vs2109),c++,c++,开发语言

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" };

 c++ 使用rapidjson对数据序列化和反序列化(vs2109),c++,c++,开发语言

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.初始化DOM
    rapidjson::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);

    // 写入 StringBuffer
    rapidjson::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;
	}
}

运行结果

c++ 使用rapidjson对数据序列化和反序列化(vs2109),c++,c++,开发语言

这里需要注意: 

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;
    else
        cout << "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));
    }
    else
        cout << "Not Finded!" << endl;

    // 相同判断
    if (doc["name"].GetString() == string("MenAngel") &&
        doc["name"] == "MenAngel" && 
        strcmp(doc["name"].GetString(),"MenAngel") == 0)
    {
        cout << "判断为相等" << endl;
    }

}

运行结果:

c++ 使用rapidjson对数据序列化和反序列化(vs2109),c++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-728659.html

到了这里,关于c++ 使用rapidjson对数据序列化和反序列化(vs2109)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案

    为何archiveRootObject和unarchiveObjectWithFile正常,而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。 [NSKeyedArchiver archiveRootObject:account toFile:path]; 和`c PPAccountModel *account = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 替换很简单,但是会一堆问题等着你解决,序列化和反序列全失败。

    2024年02月16日
    浏览(38)
  • 【数据结构】二叉树篇|超清晰图解和详解:二叉树的序列化和反序列化

    博主简介: 努力学习的22级计算机科学与技术本科生一枚🌸 博主主页: @是瑶瑶子啦 每日一言🌼: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏 🍊 序列化 :本质就是 二叉树的遍历 ,就那么几个:前序、中序、后序、层序。而序列化只不过就是 在遍历到

    2024年02月10日
    浏览(53)
  • Web开发模式、API接口、restful规范、序列化和反序列化、drf安装和快速使用、路由转换器(复习)

    一 Web开发模式 1. 前后端混合开发模式 2.前后端分离开发模式 二 API接口 三 restful规范 四 序列化和反序列化 五 drf安装和快速使用

    2024年02月10日
    浏览(44)
  • Unity-序列化和反序列化

    序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 1 自定义的具有Serializable特性的非抽象、

    2024年01月24日
    浏览(57)
  • 【Linux】序列化和反序列化

    在网络编程中,直接使用 结构体 进行数据传输会出错,因为 本质上socket无法传输结构体 ,我们只有将结构体装换为字节数组,或者是字符串格式来传输,然后对端主机收到了数据,再将其转化为结构体,这就是序列化和反序列化的过程! 序列化 (Serialization)是将对象的状态

    2024年02月10日
    浏览(43)
  • Java序列化和反序列化

    目录 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含义 ​序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。 2、用途 (1)传输网络对象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表对象

    2023年04月25日
    浏览(39)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种常用的数据交换格式,用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式,它使用易于理解的键值对的形式表示数据。JSON数据结构简单明了,易于读写和解析,是基于JavaScript的一种常用数据

    2024年02月09日
    浏览(58)
  • Java序列化和反序列化机制

    在阅读 ArrayList 源码的时候,注意到,其内部的成员变量动态数组 elementData 被Java中的 transient 修饰 transient 意味着Java在序列化时会跳过该字段(不序列化该字段) 而Java在默认情况下会序列化类(实现了 Java.io.Serializable 接口的类)的所有非瞬态(未被 transient 修饰

    2024年03月15日
    浏览(50)
  • TCP定制协议,序列化和反序列化

    目录 前言 1.理解协议 2.网络版本计算器 2.1设计思路 2.2接口设计 2.3代码实现: 2.4编译测试 总结         在之前的文章中,我们说TCP是面向字节流的,但是可能对于面向字节流这个概念,其实并不理解的,今天我们要介绍的是如何理解TCP是面向字节流的,通过编码的方式,自

    2024年02月12日
    浏览(34)
  • [计算机网络]---序列化和反序列化

    前言 作者 :小蜗牛向前冲 名言 :我可以接受失败,但我不能接受放弃    如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正  目录  一、再谈协议 二、序列化和反序化 1、网络版本计算器的场景搭建 2、

    2024年02月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包