Qt之JSON文件解析

JSON介绍

JSON全程JavaScript Object Notation,作为一种轻量级的数据交换格式,正在逐步取代xml,成为网络数据的通用格式。以大括号作为起止符,实质是不排序的键值对。其中键要求是QString类型,值可以是任意类型。

将json文件放置在根目录下

在这里插入图片描述

QJson转换

将打开的QJson文件类型为QByteArray转换成QJsonDocument对象;将QJsonDocument对象转换成QJsonObject对象;将QJsonObject对象转换成 QJsonArray数组 。

	QByteArray fileDate = file.readAll();
        //将QByteArray转换成QJsonDocument
        QJsonDocument fileDoc = QJsonDocument::fromJson(fileDate);
        //根据服务器或者josn文件的json数组格式,判断是jsonObject还是jsonArray
        QJsonObject object = fileDoc.object();
        //通过key来读取数据
        QJsonArray resultArray = object.value("result").toArray();
        //QJsonArray也是一个数组

根据自己需求提取JSON

**截取部分json文件**
{
    "resultcode": "200",
    "reason": "成功的返回",
    "result": [
        {
            "movieid": "10641",
            "rating": "7.3",
            "genres": "动作/惊悚/科幻",
            "runtime": "139 min",
            "language": "英语/法语/日语",
            "title": "哥斯拉",
            "poster": "http://v.juhe.cn/movie/img?5146",
            "writers": "迪安·德夫林,罗兰·艾默里奇,...",
            "film_locations": "美国",
            "directors": "罗兰·艾默里奇",
            "rating_count": "3191",
            "actors": "马修·布罗德里克 Matthew Broderick,让·雷诺 Jean Reno,玛丽亚·皮提罗 Maria Pitillo,汉克·阿扎利亚 Hank Azaria",
            "plot_simple": "一道亮光划过天际,太平洋上波涛汹涌,海浪以不可思议的速度将一架货机卷入海里;巴哈马丛林中,出现了巨大的脚印;一股神秘的力量一直朝纽约而来,这座人口稠密的都市即将受到这个怪兽“哥斯拉”的袭击。“哥斯拉”是因为核试验造成气..",
            "year": "1998",
            "country": "美国",
            "type": "null",
            "release_date": "19980518",
            "also_known_as": "酷斯拉,怪兽哥斯拉"
        },
        {
            "movieid": "133175",
            "rating": "-1",
            "genres": "动画/短片/喜剧",
            "runtime": "2 min",
            "language": "无",
            "title": "小鹿斑比遇见哥斯拉",
            "poster": "http://v.juhe.cn/movie/img?14923",
            "writers": "Marv Newland",
            "film_locations": "加拿大",
            "directors": "Marv Newland",
            "rating_count": "7",
            "actors": "",
            "plot_simple": "null",
            "year": "1969",
            "country": "加拿大",
            "type": "null",
            "release_date": "20090418",
            "also_known_as": ""
        },

编译输出JSON文件信息

for(int i=0; i< resultArray.size(); i++)
        {
            QJsonObject resultObject = resultArray.at(i).toObject();
            QString genres           = resultObject.value("genres").toString();
            QString runtime          = resultObject.value("runtime").toString();
            QString language         = resultObject.value("language").toString();
            QString title            = resultObject.value("title").toString();
            QString poster           = resultObject.value("poster").toString();
            QString film_locations   = resultObject.value("film_locations").toString();
            qDebug() <<genres;
            qDebug() <<runtime;
            qDebug() <<language;
            qDebug() <<title;
            qDebug() <<poster;
            qDebug() <<film_locations;
        }

在这里插入图片描述

获取网络图片

这里用到俩个类QNetworkRequest类QUr类l

QUrl类:它可以解析和构造编码和非编码形式的url。QUrl还支持国际化域名(IDN)。使用QUrl最常见的方法是通过传递QString通过构造函数初始化它;否则,也可以使用setUrl()。URL可以用两种形式表示:编码的或未编码的。未编码的表示形式适合显示给用户,但编码的表示形式通常是发送给web服务器的内容。例如,未编码的URL“http://bühler.example.com/List of applicators.xml”将作为“http://xn–bhler kva.example.com/List%20of%20applicators.xml”发送到服务器。

QNetworkRequest类: QNetworkRequest类保存要用QNetworkAccessManager发送的请求。QNetworkRequest是网络访问API的一部分,它是一个类,包含通过网络发送请求所需的信息。它包含一个URL和一些可以用来修改请求的辅助信息。

提取JSON显示在UI组件上

  QJsonObject resultObject = resultArray.at(5).toObject();
        QString genres           = resultObject.value("genres").toString();
        QString runtime          = resultObject.value("runtime").toString();
        QString language         = resultObject.value("language").toString();
        QString title            = resultObject.value("title").toString();
        QString poster           = resultObject.value("poster").toString();
        QString film_locations   = resultObject.value("film_locations").toString();


        ui->genresLabel->setText(genres);
        ui->runtimeLabel->setText(runtime);
        ui->languageLabel->setText(language);
        ui->titleLabel->setText(title);
        ui->posterLabel->setText(poster);
        ui->film_locationsLabel->setText(film_locations);

建立读取JSON文件槽函数

void JsonFile::readDate(QNetworkReply*reply)
{
    QByteArray array = reply->readAll();
    QPixmap mmp;
    mmp.loadFromData(array);//loadFromData:是一个重载函数,使用指定的格式和转换标志从二进制数据加载pixmap
    ui->posterLabel->setPixmap(mmp);
}

建立槽函数连接

 //当请求的网络完成时,会发送一个finished信号
connect(&manger,&QNetworkAccessManager::finished,this,&JsonFile::readDate);
```![在这里插入图片描述](https://img-blog.csdnimg.cn/2020042318291921.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU4NTc1MQ==,size_16,color_FFFFFF,t_70)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44585751

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值