IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Qt内部的对Json支持类的说明使用简述 -> 正文阅读

[大数据]Qt内部的对Json支持类的说明使用简述

一、相关类

模块:core
使用时需在pro文件添加 QT += core

类名简述
QJsonArray封装了JSON数组
QJsonDocument对JSON 文档的读写支持
QJsonObject封装JSON对象
QJsonParseError记录JSON解析过程的错误
QJsonValue封装纯在JSON文件里的值

二、自我理解

1、Json简介

JSON格式的文档一般都是用{ }来包括的,内部是以键值对规范的

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组,数组可以包含多个对象

键: 必须是字符串
值: 多种类型,可以是对象、字符串,数组、数字、bool等
(其实就是值是支持嵌套)

在这里插入图片描述参考QJsonValue的类型

实例:

{
    "sites": [
        { "name":"菜鸟教程" , "url":"www.runoob.com" }, 
        { "name":"google" , "url":"www.google.com" }, 
        { "name":"微博" , "url":"www.weibo.com" }
    ]
}

2、获取HTTP 请求的 JSON

开发时,能通过HTTPS API请求获得JSON数据

https://geoapi.qweather.com/v2/city/lookup?location=chaoyang&adm=beijing&key=你的开发Key 为例
具体API调用流程看这个web主页参考:https://geoapi.qweather.com

在Fiddler里面通过 WebView 按钮能看见
在这里插入图片描述
JSON视图下:
在这里插入图片描述

3、Qt对应QJSON相关类解释

  • 一个Json内容 就是一个 QJsonDocument
  • 凡是获取的Json内容是用 { } 括起来的是 对应 一个 QJsonObject
  • 凡是获取的Json内容是用 [ ]括起来的是 对应 一个 QJsonArray
  • 凡是在 ‘ : ’ 后面的是对应 一个 QJsonValue

下图 (只画了两个 QJsonObject ):
在这里插入图片描述
下图(画了三个 QJsonArray ):
在这里插入图片描述
下图(画了三个 QJsonValue ):
在这里插入图片描述
本例中的Json用Qt类的结构描述可看成这样
在这里插入图片描述

4、Qt实例代码说明

  • (QJsonDocument支持装载 QJsonArray,QJsonObject )
  • (使用的 如下函数
	void setArray(const QJsonArray &array)
	void setObject(const QJsonObject &object)

)

1、构造QJsonArray并装载于QJsonDocument中

类层次图:
在这里插入图片描述
代码:

// main.cpp
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

    QJsonArray jsArray;
	QJsonDocument jsDocument_01;

    jsArray.append(QJsonValue(124));
    jsArray.append(QJsonValue(65));

    QJsonObject object
    {
        {"property1", 1},
        {"property2", 2}
    };

    jsArray.append(object);

    jsDocument_01.setArray(jsArray);

    qDebug()<<"JS: size: "<<jsDocument_01.array().size();
    qDebug()<<"JS: array[0]: "<<jsDocument_01.array().at(0).toInt();
    qDebug()<<"JS: array[1]: "<<jsDocument_01.array().at(1).toInt();
    qDebug()<<"JS: array[2]: "<<jsDocument_01.array()[2].toObject()["property1"].toInt();
    qDebug()<<"JS: array[2]: "<<jsDocument_01.array()[2].toObject()["property2"].toInt();
    
    return a.exec();
}

2、构造QJsonObject并装载于QJsonDocument中

类层次图:
在这里插入图片描述

代码:

// main.cpp
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QJsonDocument jsDocument;
    QJsonArray jsArray;
    QJsonObject jsObject;

    QJsonObject jsObject_01
    {
        {"property1", 1},
        {"property2", 2}
    };
    
    //放在装填数据语句之前 无效 - 不信可以注释后面的 setObject()
    //jsDocument.setObject(jsObject);

    //装填数组
    jsArray.append(QJsonValue("成都市-双流区-xxx小区"));
    jsArray.append(QJsonValue("已婚"));
    jsArray.append(QJsonValue("血型:B型"));

    //插入数据
    jsObject.insert("name", QJsonValue("张三"));
    jsObject.insert("sex", QJsonValue("男"));
    jsObject.insert("phone", QJsonValue(1234564));
    jsObject.insert("other", jsArray);
    jsObject.insert("propites", jsObject_01);

    //一定要放在装填数据语句之前
    jsDocument.setObject(jsObject);

    qDebug()<<"jsDocument isEmpty: "<<jsDocument.isEmpty();
    qDebug()<<"jsDocument.object(): "<<jsDocument.object();

    qDebug()<<"name: "<<jsDocument.object().value("name").toString();
    qDebug()<<"sex: "<<jsDocument.object().value("sex").toString();
    qDebug()<<"phone: "<<jsDocument.object().value("phone").toInt();

    //输出数组
    qDebug()<<"other-0: "<<jsDocument.object().value("other").toArray()[0].toString();
    qDebug()<<"other-1: "<<jsDocument.object().value("other").toArray()[1].toString();
    qDebug()<<"other-2: "<<jsDocument.object().value("other").toArray()[2].toString();

    //输出对象
    qDebug()<<"propites-0: "<<jsDocument.object().value("propites").toObject().value("property1").toInt();
    qDebug()<<"propites-1: "<<jsDocument.object().value("propites").toObject().value("property2").toInt();
    return a.exec();
}

调试图:(看jsObject即可)
在这里插入图片描述
运行图:
在这里插入图片描述

3、从QByteArray读取数据(解析服务器返回JSON数据)

假设获取到服务器的数据是 QByteArray 内容如下(已经处理了):
<<< 欲知道如何获取到QByteArray 的Json数据,参看链接:link >>>

QByteArray array("{\"code\":\"200\",\"location\":[{\"name\":\"\xE6\x9C\x9D\xE9\x98\xB3\","
                     "\"id\":\"101010300\",\"lat\":\"39.92149\",\"lon\":\"116.48641\",\"adm2\":"
                     "\"\xE5\x8C\x97\xE4\xBA\xAC\",\"adm1\":\"\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82\","
                     "\"country\":\"\xE4\xB8\xAD\xE5\x9B\xBD\",\"tz\":\"Asia/Shanghai\",\"utcOffset\":"
                     "\"+08:00\",\"isDst\":\"0\",\"type\":\"city\",\"rank\":\"15\",\"fxLink\":"
                     "\"http://hfx.link/2az1\"}],\"refer\":{\"sources\":[\"QWeather\"],\"license\":["
                     "\"commercial license\"]}}");

类层次图:
在这里插入图片描述
代码:

// main.cpp
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QtDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QByteArray array("{\"code\":\"200\",\"location\":[{\"name\":\"\xE6\x9C\x9D\xE9\x98\xB3\","
                     "\"id\":\"101010300\",\"lat\":\"39.92149\",\"lon\":\"116.48641\",\"adm2\":"
                     "\"\xE5\x8C\x97\xE4\xBA\xAC\",\"adm1\":\"\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82\","
                     "\"country\":\"\xE4\xB8\xAD\xE5\x9B\xBD\",\"tz\":\"Asia/Shanghai\",\"utcOffset\":"
                     "\"+08:00\",\"isDst\":\"0\",\"type\":\"city\",\"rank\":\"15\",\"fxLink\":"
                     "\"http://hfx.link/2az1\"}],\"refer\":{\"sources\":[\"QWeather\"],\"license\":["
                     "\"commercial license\"]}}");

    QByteArray outPut;
    QJsonDocument jsDocument;
    QJsonParseError jsParaseError;
    QJsonArray jsArray;
    QJsonObject jsObject;

	//转换数据的
    jsDocument = QJsonDocument::fromJson(array, &jsParaseError);

    if(jsParaseError.error == QJsonParseError::NoError)
    {
        qDebug()<<"jsDocument isNull(): "<<jsDocument.isNull();
        qDebug()<<"jsDocument isEmpty(): "<<jsDocument.isEmpty();
        qDebug()<<"jsDocument isArray(): "<<jsDocument.isArray();
        qDebug()<<"jsDocument isObject: "<<jsDocument.isObject();

        jsObject = jsDocument.object();
        jsArray = jsDocument.array();
    }

    //jsObject的部分参数
    qDebug()<<"jsObject contains(code):"<<jsObject.contains("code");
    qDebug()<<"jsObject contains(location):"<<jsObject.contains("location");
    qDebug()<<"jsObject contains(refer):"<<jsObject.contains("refer");

    qDebug()<<"jsObject count(): "<<jsObject.count();
    qDebug()<<"jsObject keys(): "<<jsObject.keys();
    qDebug()<<"jsObject length(): "<<jsObject.length();
    qDebug()<<"jsObject size(): "<<jsObject.size();

    //数据读取
    qDebug()<<"code.value(): "<<jsObject.value("code").toString();
    qDebug()<<"location.name.value(): "<<jsObject.value("location").toArray()
        [0].toObject().value("name").toString();
    qDebug()<<"location.id.value(): "<<jsObject.value("location").toArray()
        [0].toObject().value("id").toString();
    qDebug()<<"location.lat.value(): "<<jsObject.value("location").toArray()
        [0].toObject().value("lat").toString();
    qDebug()<<"location.lon.value(): "<<jsObject.value("location").toArray()
            [0].toObject().value("lon").toString();

    qDebug()<<"location.adm2.value(): "<<jsObject.value("location").toArray()
            [0].toObject().value("adm2").toString();
    qDebug()<<"location.adm1.value(): "<<jsObject.value("location").toArray()
            [0].toObject().value("adm1").toString();
    qDebug()<<"location.country.value(): "<<jsObject.value("location").toArray()
            [0].toObject().value("country").toString();
    qDebug()<<"location.fxLink.value(): "<<jsObject.value("location").toArray()
            [0].toObject().value("fxLink").toString();

    qDebug()<<"refer.sources.values(): "<<jsObject.value("refer").toObject()
              .value("sources").toArray()[0].toString();
    qDebug()<<"refer.license.values(): "<<jsObject.value("refer").toObject()
              .value("license").toArray()[0].toString();

    return a.exec();
}

运行图:
在这里插入图片描述

三、总结

  • JSON中的值可以多重嵌套
  • QJsonValue对应不同的值时需要层层转换(使用toXXX转换,toInt,toArray,toObject)
  • QJsonValue中间转换过程可能复杂,但最后一层转换为可用数据一定是转换为 Qt内建的基础数据类型如下图的 QString, int,Bool等在这里插入图片描述
  • 全过程大概示意图如下:在这里插入图片描述
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章           查看所有文章
加:2022-01-17 11:34:12  更:2022-01-17 11:35:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:51:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码