最新要闻
- 还买iPhone 14/15?新iPhone准备中:苹果弃灵动岛 更完美
- 人民日报评电视收费乱象:从用户身上“薅羊毛” 广告还见缝插针
- 微头条丨今年首场寒潮来袭 最强雨雪下在哪?这些地区将迎暴雨、暴雪
- 天天滚动:2022年 我把比亚迪DM-i插混当纯电动车 开了1万公里
- 《王者荣耀》星会员正式上线:全新充值体系 打破贵10等级限制
- 当前速讯:神舟新款游戏本上架:13代i5+满血RTX 3050 4999元
- 最强高端!小米13 Ultra有望下月发:终于告别USB 3.0
- 动态:家长炮轰《中国奇谭》烂 吓哭孩子引热议:专家回应 给成年人看
- 环球观焦点:贾跃亭又摊上事了:法拉第未来接到纳斯达克摘牌警告
- 热文:华硕全球首秀四频段Wi-Fi 7路由器:峰值下载2.5万兆
- 滚动:惠普新款EliteBook 1040笔记本发布:13代酷睿、2K 120Hz屏
- 天天视点!为什么一个病毒株传着传着就没了?
- Redmi K40S 12+256G顶配版不到1900元:骁龙870和OIS都有
- 各大新能源车企年度KPI出炉 特斯拉未达标 比亚迪称王
- 每日时讯!酷安最火骁龙8系手机诞生!一加11酷安热度第一
- 时隔两年 国美真快乐App重新更名国美
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
微动态丨【QtJson】用Qt自带的QJson,直接一步到位封装和解析一个类的实例对象!
【资料图】
之前貌似没有看过类似的代码我们现在的要求就是直接在不知道类成员的情况下,把一个类丢进去就能生成一个Json字符串,也可以把一个字符串和一个类成员丢进去就能根据成员变量名匹配到元素并赋值,大概就这样
中心思想就是Q_PROPERTY宏提供了一个property类型,可以直接通过变量名称获得一个变量名称对应的字符串,比如int a;可以直接获得一个"a"的字符串,而且还可以知道这个a 的类型。并据此来进行字符串的封装和解析。
主要是为了开发方便,就可以直接把一个QObject对象扔进去返回一个字符串,也可以把一个Json字符串和指定类的对象扔进去就直接自动把类中对应的属性修改了,总的来说应该是用点用。
#pragma region Example调用实例//Json相关方法调用实例://// 如果想要调用JsonMaker类来把你的类成员元素,假设是A a,其中包含元素qint32 a1,QString a2,bool a3进行封装,那么你需要使用Q_PROPERTY来// 声明封装a1,a2,a3元素和其set/get方法(如果需要解析就需要set方法,如果需要封装就需要get方法),set/get方法命名规则为set/get+元素名称// 比如seta1,geta2,其中不对大小写做规定,也可以写成setA1,getA2// // 调用方法如下:// 1.封装字符串// A a; // QString result = JsonMaker::Singleton().JsonSerialization(tester);// 2.解析字符串// A a// JsonMaker::Singleton().JsonDeserialization(a, Json);// 调用完毕后a中的对应数据都会被Json字符串中的数据覆盖////测试解析、封装类举例:class Tester1 :public QObject {Q_OBJECTQ_PROPERTY(QString name READ getName WRITE setname)Q_PROPERTY(QString like READ getLike WRITE setlike)Q_PROPERTY(QString birthday READ getBirthday WRITE setbirthday)//Q_PROPERTY(QString str_public READ str_public,WRITE setStr_public)Q_PROPERTY(QList list READ getList WRITE setlist)Q_PROPERTY(QList qint32_list READ getqint32_List WRITE setqint32_list)//暂时不支持float类型//Q_PROPERTY(QList float_list READ getFloat_List)Q_PROPERTY(QList double_list READ getDouble_List WRITE setdouble_list)Q_PROPERTY(QList bln_list READ getBln_List WRITE setbln_list)Q_PROPERTY(QList int_list READ getInt_list WRITE setint_list)public:Tester1(QObject* parent = Q_NULLPTR);//QString str_public = "str_public";#pragma region get funcsQString getName() {return name;}QString getLike() {return like;}QString getBirthday() {return birthday;}QList getList() {return this->list;}QList getInt_list() {return this->int_list;}QList getqint32_List() {return this->qint32_list;}QList getFlost_List() {return this->float_list;}QList getDouble_List() {return this->double_list;}QList getBln_List(){return this->bln_list;}QList getFloat_List() {return float_list;}#pragma endregion#pragma region Set Funcs/*QList list = { "123","234","345","4356" };QList qint_list = { 123,234,345,456 };QList float_list = { 1.123123,2.234234,4.345345,45.457457 };QList double_list = { 1.2443,3.52,2.351,1.235 };QList int_list = { 234,345,456,567,678,123,32 };QList bln_list = { true,false,true,false };*/Q_INVOKABLE void setlist(QList list_value) {this->list = list_value;}Q_INVOKABLE void setqint32_list(QList list_value) {this->qint32_list = list_value;}Q_INVOKABLE void setdouble_list(QList list_value) {this->double_list = list_value;}Q_INVOKABLE void setint_list(QList list_value) {this->int_list = list_value;}Q_INVOKABLE void setbln_list(QList list_value) {this->bln_list = list_value;}Q_INVOKABLE void setname(QString strValue) {this->name = strValue;}Q_INVOKABLE void setlike(QString strValue) {this->like = strValue;}Q_INVOKABLE void setbirthday(QString strValue) {this->birthday = strValue;}#pragma endregionprivate:QString name = "name";QString like = "like";QString birthday = "birthday";QList list = { "123","234","345","4356" };QList qint32_list = { 123,234,345,456 };QList float_list = { 1.123123,2.234234,4.345345,45.457457 };QList double_list = { 1.2443,3.52,2.351,1.235 };QList int_list = { 234,345,456,567,678,123,32 };QList bln_list = { true,false,true,false };};#pragma endregion//Json相关//给定任意模板类,将其公开属性打包成一个Json字符串,使用此方法需要所有的公开属性均为Q_PROPERTY宏声明,该类提供单例。//序列化类Q_PROPERTY宏声明的属性 set/get函数命名规则:get/set+属性名 如getBirthday setList,大小写不限,如果是set方法需要在set方法前面加上Q_INVOKABLE 宏//如果需要反序列化数组,请保证数组中的所有数据结构是同一个类型,否则可能会出错//注:请尽量使用int不要使用qint32,使用double不要使用floatclass JsonMaker :public QObject {JsonMaker();//提供单例public:static JsonMaker& JsonMaker::Singleton() {static JsonMaker Instance;return Instance;// TODO: 在此处插入 return 语句}//序列化类Q_PROPERTY宏声明的属性,如果有数组类型,请使用QListtemplateQString JsonSerialization(T1& T_Class_1) {auto T_Class = dynamic_cast(&T_Class_1);QJsonObject jsonObject;//通过元对象定义成员const QMetaObject* metaObject = T_Class->metaObject();for (int i = 0; i < metaObject->propertyCount(); ++i) {QMetaProperty property = metaObject->property(i);if (!property.isReadable()) {continue;}//这个不知道是什么,暂时需要先屏蔽掉if (QString(property.name()) == "objectName") {continue;}//如果是QListif (QString(property.typeName()).contains("QList")) {//这里可能要根据常见类型进行一下分类QJsonArray jsonListArray;//输入一个模板类类型,输出一个jsonObjectif (QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if (QString(property.typeName()) == "QList" || QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if (QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if (QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if(QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if (QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if (QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}else if (QString(property.typeName()) == "QList") {QList str_message = property.read(T_Class).value>();jsonListArray = QListToJsonArray(str_message);}jsonObject.insert(property.name(), QJsonValue(jsonListArray));}//如果不是QListelse {QVariant result = property.read(T_Class);jsonObject[property.name()] = QJsonValue::fromVariant(property.read(T_Class));}qDebug() << property.name();}QJsonDocument doc(jsonObject);return doc.toJson(QJsonDocument::Compact);}//反序列化类Q_PROPERTY宏声明的属性,如果有数组类型,请使用QListtemplatevoid JsonDeserialization(T& T_Class, const QString& jsonString){auto qobject = dynamic_cast(&T_Class);QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8());QJsonObject jsonObject = doc.object();// 使用QMetaObject的invokeMethod()函数来调用模板类T的setter函数const QMetaObject* metaObject = qobject->metaObject();for (int i = 0; i < metaObject->propertyCount(); ++i) {QMetaProperty property = metaObject->property(i);if (property.isReadable() && property.isWritable()) {QString propertyName = property.name();QString str_functinoname = QString("set" + propertyName);//为了转换成const char*类型必须的一个中间步骤QByteArray temp_qba_functinoname = str_functinoname.toLocal8Bit();const char* func_name = temp_qba_functinoname.data();if (jsonObject.contains(propertyName)) {QJsonValue value = jsonObject[propertyName];JsonMaker temp;qDebug() << value;switch (value.type()) {case QJsonValue::Type::Bool:QMetaObject::invokeMethod(qobject, func_name, Q_ARG(bool, value.toBool()));break;case QJsonValue::Type::Double:QMetaObject::invokeMethod(qobject, func_name, Q_ARG(double, value.toDouble()));break;case QJsonValue::Type::String:QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QString, value.toString()));break;case QJsonValue::Type::Array: {//如果是数组则需要根据情况进行解析if (!value.isArray()) {break;}QJsonArray arr = value.toArray();//下面确定数组类型this->JsonArrayDeserialization(qobject, func_name, arr);}break;case QJsonValue::Type::Object:QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QJsonValue, value));break;default:break;}}}}}private://将模板类QList转换成JsonObjecttemplateQJsonArray QListToJsonArray(QList list) {QJsonArray jsonArray;for each (T temp_T in list){jsonArray.append(QJsonValue::fromVariant(temp_T));}return jsonArray;}//解析数组并注入QObject对象void JsonArrayDeserialization(QObject* qobject, const char* func_name, QJsonArray arr) {try { //判断类型//QStringif (arr[0].type() == QJsonValue::String) {QList list_result;QJsonValue value;for each (QJsonValue temp_value in arr){list_result.append(temp_value.toString());}QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QList, list_result));}else if (arr[0].isDouble()) {//若为为整形if (arr[0].toDouble() == arr[0].toInt()) {qDebug() << arr[0].toDouble() << arr[0].toInt();QList list_result;QList list_result_2;QJsonValue value;for each (QJsonValue temp_value in arr){//int 和 qint32都需要尝试,但请尽量尝试使用qint32,这段代码占用了两倍的内存,将来可能考虑删除list_result.append(temp_value.toInt());list_result_2.append(temp_value.toInt());}if (!QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QList, list_result))) {QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QList, list_result_2));}}//若为双精度else {QList list_result;QList list_result_2;QJsonValue value;for each (QJsonValue temp_value in arr){list_result.append(temp_value.toDouble());}//double和float都会尝试,请尽量使用doubleif (!QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QList, list_result))) {QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QList, list_result_2));}}}if (arr[0].type() == QJsonValue::Bool) {QList list_result;QJsonValue value;for each (QJsonValue temp_value in arr){list_result.append(temp_value.toBool());}QMetaObject::invokeMethod(qobject, func_name, Q_ARG(QList, list_result));}}catch (const QException& e) {WriteErrorMessage("JsonArrayDeserialization","JsonArrayDeserialization", e.what());}}};}#endif // LBD_BASETOOLS
-
微动态丨【QtJson】用Qt自带的QJson,直接一步到位封装和解析一个类的实例对象!
之前貌似没有看过类似的代码我们现在的要求就是直接在不知道类成员的情况下,把一个类丢进去就能生成一...
来源: 微动态丨【QtJson】用Qt自带的QJson,直接一步到位封装和解析一个类的实例对象!
还买iPhone 14/15?新iPhone准备中:苹果弃灵动岛 更完美
人民日报评电视收费乱象:从用户身上“薅羊毛” 广告还见缝插针
微头条丨今年首场寒潮来袭 最强雨雪下在哪?这些地区将迎暴雨、暴雪
天天滚动:2022年 我把比亚迪DM-i插混当纯电动车 开了1万公里
《王者荣耀》星会员正式上线:全新充值体系 打破贵10等级限制
当前速讯:神舟新款游戏本上架:13代i5+满血RTX 3050 4999元
最强高端!小米13 Ultra有望下月发:终于告别USB 3.0
动态:家长炮轰《中国奇谭》烂 吓哭孩子引热议:专家回应 给成年人看
环球观焦点:贾跃亭又摊上事了:法拉第未来接到纳斯达克摘牌警告
全球报道:JavaScript 扁平与树形数组数据的转换
热点在线丨层叠样式表(CSS)1
当前最新:ceph-3
世界速读:区块链特辑——solidity语言基础(四)
热文:华硕全球首秀四频段Wi-Fi 7路由器:峰值下载2.5万兆
滚动:惠普新款EliteBook 1040笔记本发布:13代酷睿、2K 120Hz屏
天天视点!为什么一个病毒株传着传着就没了?
Redmi K40S 12+256G顶配版不到1900元:骁龙870和OIS都有
各大新能源车企年度KPI出炉 特斯拉未达标 比亚迪称王
焦点速读:区块链特辑——solidity语言基础(二)
每日时讯!酷安最火骁龙8系手机诞生!一加11酷安热度第一
时隔两年 国美真快乐App重新更名国美
快看点丨大前端html学习06-宽高自适应
天天观察:SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
Redis的客户端
每日时讯!关于19c RU补丁报错问题的分析处理
环球简讯:记录使用adb连接rn项目进行开发
焦点要闻:加油被惊喜到!一加11不杀后台:前一天打开的APP第二天还在
最新快讯!Python中高阶函数与装饰器教程
【新要闻】Python中的异常处理总结
flutter 效果实现 —— 全面屏效果
Mysql中的锁:表、MDL、意向锁、行锁
温子仁恐怖片新作《梅根》 拯救了北美院线一月票房
天天热点评!被假货逼疯的劳力士:终于坐不住了
全球快资讯:要的就是销量!特斯拉在新加坡优惠近7万
全球新资讯:豆瓣9.5高分动画!有家长炮轰《中国奇谭》画风吓哭孩子 网友不乐意了
全球今日报丨【首页】热销爆品开发修改商品值
加了国六B汽油 排气管喷水?网友犀利吐槽:我加了拉肚子
热讯:峰米S5 Rolling投影仪发布:360度可旋转支架 还能当音箱用
世界热推荐:米哈游创始人之一参与打造:国产独立游戏《微光之镜》今日发售
即时看!奥迪RS e-tron GT很好 但它仍是大众体系里最拧巴的产品
当前讯息:菜鸟将投2亿:补贴快递员爬楼送货上门
天天快看:iOS 16卡壳了
世界热推荐:OLED+彩色水墨翻转双屏!联想公布ThinkBook Plus Twist笔记本
天天微速讯:雷军爆料了!新机皇小米13 Ultra或将于MWC发布:影像堆料突破天际
焦点速看:因易增加儿童哮喘几率:美国或将禁止使用燃气灶
【环球播资讯】曾狠坑过乐视!中电熊猫被拉横幅维权:“还我血汗钱”
快消息!事件处理_2事件修饰符
flutter 基础 —— 事件监听
环球热门:JavaScript 将base64 转换为File
当前信息:129元 荣耀智能体脂秤3开售:Wi-Fi、蓝牙双连接
买699元手机送99元耳机!Redmi 12C价格跟米粉交个朋友
今晚20点抢京东大额红包 天猫年货节红包最后一天
每日动态!没了量子力学 你连手机都玩不了
焦点热讯:9.78万起 飞度堂弟新款东风本田来福酱上市:动力被砍、油耗不变
热门看点:Bonitasoft认证绕过和RCE漏洞分析及复现(CVE-2022-25237)
【世界快播报】操作系统 — 精髓与设计原理(第二章 操作系统概述)
速看:2023年手机还能怎样进化?三点方向
全球热议:干不过BBA!广汽讴歌退出中国市场:车型少 价格高
俄罗斯影院播放盗版《阿凡达2》:还是合法的!西方干瞪眼
【环球新视野】巴黎圣母院确认2024年重开!《刺客信条》花费2年还原
今日关注:接盘国服暴雪玩家!网易《无尽战区》明天开服 配置要求公布
每日热门:部分聚类算法简介及优缺点分析
时讯:记录--JS-SDK页面打开提示realAuthUrl错误
最新:5. 使用互斥量保护共享数据
环球新消息丨【Python爬虫实战项目】Python爬虫批量下载相亲网站数据并保存本地(附源码)
天天快看:什么是堆叠面积图?
热点在线丨老车主维权、新客户下单!特斯拉大降价后3天获3万辆订单
每日快讯!李斌:我们从来不把自己称作豪华品牌
当前观察:百度CreateAI开发者大会:李彦宏称2027前一线城市不再需要限购限行
当前热文:炒币亏了3个亿的美图满血复活了:全体员工发股票 搬入新大楼
过年微醺 RIO鸡尾酒大促!56元到手10瓶
软件开发入门教程网之MySQL NULL 值处理
环球关注:【首页】商品列表和单个商品组件封装
焦点报道:曝iPhone 15开始试产:采用国产灵动岛屏 京东方供货
天天看热讯:李想:理想L7小订最大用户群来自特斯拉车主
中国新能源汽车补贴13年:投入超1500亿元 覆盖317万辆车
13种Shell逻辑与算术,能写出5种算你赢!
提升代码可读性,减少if-else的几个小技巧
天天快看:携程梁建章建议:取消中考 缩短中小学学制 提前2年上班
时代变了!日系豪华败走中国:停产停售、官网504、全面退场
焦点速看:DOS初识
【天天播资讯】《春晚》收视率史低 2023年很多节目真实生活取材 这次必看
全球报道:干掉致命疾病!全球首款蜜蜂疫苗获批
转子发动机回归!马自达官宣:增程式版MX-30本月发布
环球速读:解决安卓四大不可能 李杰:一加11 16GB流畅用四年
环球快资讯:再也不怕侧方停车!现代展示e-Corner系统:还能“坦克掉头”
ElasticSearch必知必会-基础篇
环球快报:火山引擎 DataLeap 通过中国信通院测评,数据管理能力获官方认可!
全球速递!开源动物行为分析实验箱(斯金纳箱)需求调研分析
世界看点:低代码开发:释放数字化生产力
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具
百事通!成了!微信:视频号用户总使用时长接近朋友圈80%
天天要闻:开袋即食 一口弹牙 大牌优形肉肠0.99元/根(商超2.5元)
快资讯:期待!《生化危机4:重制版》威斯克或将登场
特斯拉门店:降价维权后销量翻倍!全国一天提车量超1万台
2023支付宝集五福最全攻略 神秘玩法千万别错过
琥珀银杏果是什么东西?琥珀银杏果是什么地方的菜?
兵长一米六是什么意思?兵长一米六顺口溜
美髯公指的是谁?美髯公是什么意思?