qt操作json(QT 教程)

以故事方式来学习如何使用Qt接口来操作JSON数据。

大家好,又见面了,我是你们的朋友全栈君。

以故事方式来学习如何使用Qt接口来操作JSON数据。

JSON三兄弟

老大哥QJsonValue

  • 主要用于封装JSON值,类似于QVariant。
    它能够存储以下值:
类型 QJsonValue类型
bool QJsonValue::Bool
double QJsonValue::Double
string QJsonValue::String
array QJsonValue::Array
object QJsonValue::Object
null QJsonValue::Null
  • QVariant互转
QJsonValue fromVariant(const QVariant &variant)
QVariant QJsonValue::toVariant() const
  • 可以与QJsonObjectQJsonArray互转
QJsonValue::QJsonValue(const QJsonArray &a)
QJsonObject QJsonValue::toObject() const

QJsonValue::QJsonValue(const QJsonObject &o)
QJsonArray QJsonValue::toArray() const

二哥QJsonObject

  • 负责封装JSON对象,是键/值对列表,其中键是惟一的字符串,值由QJsonValue表示。
  • QJsonObject与QVariantMap可以互相转换
  • 接口与QMap相似,都具有size()、insert()和remove()等操作,还可以使用标准C++迭代器模式对其内容进行迭代。
  • 直接构造使用:
QJsonObject jsonObject
{ 
   
    { 
   "key1", 1},
    { 
   "key2", 6.6},
    { 
   "key3", "Hello world"},
    { 
   "array", QJsonArray({ 
   1, 2, 3})}
};
  • 类似于QVariantMap操作:
QJsonObject jsonObject;
jsonObject["key1"] = 1;
jsonObject["key2"] = 6.6;
jsonObject.insert("key3", "Hello world");
jsonObject["array"] = QJsonArray({ 
   1, 2, 3}); 
  • 与QVariantMap互相转换
QJsonObject fromVariantMap(const QVariantMap &map)
QVariantMap QJsonObject::toVariantMap() const
  • 还可以与QVariantHash互相转换,操作类似QVariantMap转换。

三弟QJsonArray

  • 负责封装JSON数组,JSON数组是一个值列表,接口与QVariantList类似,QJsonArray与QVariantList可以互相转换。

  • QJsonList操作于QList相似,都具有size()、insert()和removeAt()等操作,还可以使用标准的C++迭代器模式对其内容进行迭代。

  • 直接赋值使用:

QJsonArray jsonArray = { 
    1, 6.6, QString("Hello world") };
  • 接口操作使用:
QJsonArray jsonArray;
jsonArray.append(1);
jsonArray.append(6.6);
jsonArray.insert(2, "Hello world");
  • 与QVariantList互相转换:
QJsonArray fromVariantList(const QVariantList &list)
QVariantList QJsonArray::toVariantList() const

JSON管家

  一天,三兄弟玩得甚欢,管家有些烦恼,三兄弟年龄不小了,还整天捣蛋,苦不堪言,是时候帮它们解决人生大事了,让他们得老婆来管这三兄弟。管家暗暗窃喜。老夫赶紧将他们的资料(数据)转换为字符串发给对面Web端的大户人家先。

  管家拿出QJsonDocument工具转换他们三兄弟的资料。

QJsonDocument(const QJsonObject &object)
QJsonDocument(const QJsonArray &array)

QByteArray toJson() const

  分别将QJsonObject与QJsonArray转换为QByteArray。

QByteArray byteArray1 = QJsonDocument(jsonObject).toJson();
QByteArray byteArray2 = QJsonDocument(jsonArray).toJson();

  管家看了看,拿到资料了,不知道资料是否正确,还是要确保一下就使用isNull接口验证:

bool QJsonDocument::isNull() const // 如果返回为true则JSON数据解析不正确或为空。

  焦急的管家等了几天,对面Web端怎么会没有答复的。正在焦虑走来走去,是不是资料不够好?还是发送出去格式不好看,看来要给他们弄弄格式,于是就找来了生成字符串的toJson来解决。

  toJson面对焦急得管家自然也不敢怠慢,立马给出解决方案。

QByteArray toJson(QJsonDocument::JsonFormat format) const
  • JsonFormat::Indented(缩进型)
{ 
   
    "key1": 1,
    "key2": 6.6
}
  • JsonFormat::Compact(紧凑型)
{ 
   "key1":1,"key2":6.6}

  管家修改了一下格式发出去,很快就收到对面妹子发送过来资料数据了,要快快解析看看。

  管家先将QByteArray数据转换为QJsonDocument对象,然后再转换为QJsonObject或QJsonArray即可。

QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = nullptr)

  管家看了看,老夫还是有点效果的。

QJsonDocument jsonDoc = QJsonDocument::fromJson("{\"address\":\"村口客栈见\",\"note\":\"带点吃的\"}");

JSON背锅者

  管家又接收到了一封信,可是解析不出来,正在头皮发麻着思考到底是那一步出错了。

  突然跳出一个人QJsonParseError说:管家这锅我来背,我帮你找出问题,但我又一个小小得要求,就是你也给我介绍介绍。

  管家无奈只好答应。

QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson("{\"note\":\"二哥有点帅\"}", &jsonError);
qDebug()<<jsonError.errorString();

  小子你可以啊,原来fromJson还有这操作。

后续

  管家将此事告诉他们三兄弟,如获珍宝一样。老大哥还说,看来我单身30年就要终结了。二哥则表示要在妹子面前露一手,三弟也不甘示弱赶紧去问老爹准备点钱。

  后续他们三兄弟结局如何?,是否抱得美人归?请关注下篇Qt之JSON教程-实战篇


  • 文章首发于微信公众号:Qt君
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126528.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MediaCodec基本原理及使用「建议收藏」

    MediaCodec基本原理及使用「建议收藏」MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。广义而言,MediaCodec的工作原理就是处理输入数据以产生输出数据。具体来说,MediaCodec在编解码的过程中使用了一组输入/输出缓存区来同步或异步处理数据:首先,客户端向获取到的编解码器输入缓存区写入要编解码的数据并将其提交

  • JavaScript字符串截取

    JavaScript字符串截取一、常用方法说明1.substr2.substring3.slice二、举例说明1.substr2.substring3.slice

  • 八数码问题简单解决办法

    八数码问题简单解决办法问题分析:八数码问题是一个经典的BFS问题,把棋局看成一个状态图,共有9!种状态。从初始棋局开始,每次转移到下个状态,直到目标棋局为止。仔细分析可知,八数码的关键是判重,如果不去除重复状态,程序会产生很多无效状态,从而复杂度大大增加解决算法:BFS+Cantor案例分析:(0表示空格所在位置)初始棋局:|1|2|3||0|8|4||7|6|5|目标棋局:|1|0|…

  • 国外服务器直播网站,海外直播服务器搭建

    国外服务器直播网站,海外直播服务器搭建背景:最近有个朋友的APP需要在国外搭建一个直播服务器,因为他们的主播在韩国(主播主要是记者),而观众主要在国内,叫我帮忙给他们开发一个直播服务器。目前开源的直播服务程序有:SRS,Nginx-rtmp;如果是做开发的同学应该有所了解,SRS是基于C++写的,Nginx-rtmp模块是Ngxin的第三方C模块。一开始我是直接部署SRS/Ngxin-rtmp到我的韩国的服务器,结果直播rtmp或者…

  • 基于1DCNN(一维卷积神经网络)的机械振动故障诊断

    基于1DCNN(一维卷积神经网络)的机械振动故障诊断基于1DCNN(一维卷积神经网络)的机械振动故障诊断机械振动故障诊断最为经典的还是凯斯西储实验室的轴承故障诊断,开学一周了,上次改编鸢尾花分类的代码可用,但是并不准确。开学一周重新改编了别人的一篇代码,亲测好用。不多咧咧直接放上去(基于Tensorflow2.0)(Spyder4软件上跑的)数据集时本人把凯西轴承实验驱动端内圈损坏尺寸0.14和0.21做的二分类,数据集中0代表的0.14而1代表的0.21具体看下面最后#-*-coding:utf-8-*-“””CreatedonTue

  • c 语言条件运算符,C 语言条件运算符详细讲解

    c 语言条件运算符,C 语言条件运算符详细讲解C语言条件运算符详细讲解如果希望获得两个数中最大的一个,可以使用if语句,例如:if(a>b){max=a;}else{max=b;}不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为:表达式1?表达式2:表达式3条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2的值作为整个条件表达式的值,否则以表达式3的值作为整…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号