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

Qt中使用RapidJSON

RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自 RapidXml。
RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。
http://rapidjson.org/zh-cn/官网

使用代码如下:实现Document转出到QVariantMap


#include <QtCore/QCoreApplication>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>#include "handlerapidjson.h"
#include <QMap>
#include <QByteArray>
#include <QVariantMap>using namespace rapidjson; QString getString(rapidjson::Document &doc, QString key)
{QString str = "";if (doc.HasMember(key.toLocal8Bit().data()) && doc[key.toLocal8Bit().data()].IsString()){str = QString::fromLocal8Bit(doc[key.toLocal8Bit().data()].GetString());}return str;}QString getStringFromObj(rapidjson::Value& obj, QString key)
{QString str = "";if (obj.HasMember(key.toLocal8Bit().data()) && obj[key.toLocal8Bit().data()].IsString()){str = QString::fromLocal8Bit(obj[key.toLocal8Bit().data()].GetString());}return str;}QString valueToString(const rapidjson::Value &objValue)
{QString rstr;if (objValue.IsString()){rstr = QString(objValue.GetString()); }else if (objValue.IsInt()){rstr = QString("%1").arg(objValue.GetInt());}else if (objValue.IsDouble()){rstr = QString("%1").arg(objValue.GetDouble());}else if (objValue.IsBool()){rstr = QString("%1").arg(objValue.GetBool());}else if (objValue.IsNumber()){rstr = QString("%1").arg(objValue.GetInt64());}else if (objValue.IsInt64()){rstr = QString("%1").arg(objValue.GetInt64());}return rstr;
}QVariantMap pareDoc(rapidjson::Document &document)
{//暂时只支持一层QVariantMap rmap;for (rapidjson::Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr){const rapidjson::Value& objKey = itr->name;const rapidjson::Value& objValue = itr->value;QString key = QString(objKey.GetString());QString valuestr;if (objValue.IsObject()){QVariantMap objmap;for (rapidjson::Value::ConstMemberIterator objIt = itr->value.MemberBegin(); objIt != itr->value.MemberEnd(); ++objIt){const rapidjson::Value& childobjKey = objIt->name;const rapidjson::Value& childobjValue = objIt->value;QString childkey = QString(childobjKey.GetString());QString childvaluestr = valueToString(childobjValue);objmap.insert(childkey, childvaluestr);}rmap.insert(key,objmap);}else if (objValue.IsArray()){QVariantList tmplist;for (rapidjson::SizeType i = 0; i < objValue.Size(); ++i) {const rapidjson::Value& element = objValue[i];if (element.IsObject()){//解析对象QVariantMap objmap;for (rapidjson::Value::ConstMemberIterator objIt = element.MemberBegin(); objIt != element.MemberEnd(); ++objIt){const rapidjson::Value& childobjKey = objIt->name;const rapidjson::Value& childobjValue = objIt->value;QString childkey = QString(childobjKey.GetString());QString childvaluestr = valueToString(childobjValue);objmap.insert(childkey, childvaluestr);}tmplist << objmap;}else{	//解析数组valuestr = valueToString(element);tmplist << valuestr;}}rmap.insert(key,tmplist);}else {valuestr = valueToString(objValue);rmap.insert(key,valuestr);}}return rmap;}void writeTest()
{rapidjson::Document document;  document.SetArray();  QString sss = "sss";rapidjson::Document::AllocatorType& allocator = document.GetAllocator();  // 创建一个JSON对象并添加到数组中  rapidjson::Value obj1(rapidjson::kObjectType);  obj1.AddMember(rapidjson::Value().SetString(sss.toLocal8Bit().data(),allocator), rapidjson::Value().SetString(sss.toLocal8Bit().data(),allocator), allocator);  obj1.AddMember("age", 30, allocator);  document.PushBack(obj1, allocator);  // 创建另一个JSON对象并添加到数组中  rapidjson::Value obj2(rapidjson::kObjectType);  obj2.AddMember("name", "Doe", allocator);  obj2.AddMember("age", 25, allocator);  //document.PushBack(obj2, allocator);  rapidjson::Value obj3(rapidjson::kArrayType);obj3.PushBack(obj2, allocator); document.SetObject();document.AddMember("keyid", obj3, allocator);  // 将JSON数组转换为字符串  rapidjson::StringBuffer buffer;  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);  document.Accept(writer);  std::cout << buffer.GetString() << std::endl;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);const char* json = "{\"project\":\"rapidjson\",\"stars\":10, \"obj\": {\"a\":\"1\",\"c\":1720243638463},\"list\":[1,2,3,4], \"listobj\":[{\"a\":\"1\",\"c\":1720243638463}]}";Document d;d.Parse(json);QVariantMap rmap = pareDoc(d);return 1;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Gitea 仓库事件触发Jenkins远程构建
  • 从零编写一个神经网络完成手写数字的识别分类(pytorch实现)
  • 通过Bugly上报的日志查找崩溃闪退原因
  • Rust: 关于Pin以及move前后分析
  • Python基础-循环语句
  • 安全防御,防火墙配置NAT转换智能选举综合实验
  • 在家上网IP地址是固定的吗?
  • Is Temperature the Creativity Parameter of Large Language Models?阅读笔记
  • GitHub+Picgo图片上传
  • Web学习day04
  • 未来互联网的新篇章:深度解析Facebook的技术与战略
  • rust way step 1
  • 宏碁F5-572G-59K3笔记本笔记本电脑拆机清灰教程(详解)
  • 中职网络安全B模块渗透测试server2003
  • 解释如单例、工厂、观察者等常见设计模式在Android开发中的应用。
  • 【Leetcode】101. 对称二叉树
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • github从入门到放弃(1)
  • JavaScript 一些 DOM 的知识点
  • Python进阶细节
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 免费小说阅读小程序
  • 漂亮刷新控件-iOS
  • 王永庆:技术创新改变教育未来
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Kafka_深入探秘者(2):kafka 生产者
  • ###STL(标准模板库)
  • #pragam once 和 #ifndef 预编译头
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (function(){})()的分步解析
  • (第一天)包装对象、作用域、创建对象
  • (算法二)滑动窗口
  • (五)MySQL的备份及恢复
  • (学习日记)2024.01.09
  • (转)LINQ之路
  • (转)Linux下编译安装log4cxx
  • (转载)(官方)UE4--图像编程----着色器开发
  • .CSS-hover 的解释
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net8.0与halcon编程环境构建
  • .NET处理HTTP请求
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /usr/bin/env: node: No such file or directory
  • @GetMapping和@RequestMapping的区别
  • [000-01-022].第06节:RabbitMQ中的交换机介绍
  • [2021 蓝帽杯] One Pointer PHP