QT日记八,QT中的json应用

一、什么是json

JSON就是数据封装形式,它是用来封装数据,相当于一个 包装盒子。
JSON对象 ---- > 单个类型的数据,比如:int char string
JSON数组 ----> 相当于一个数组,可以用来存放:int char ,类类型
在数据封装中,使用符号“{ }”代表对象,使用符号“[ ]”代表数组
JSON对象和JSON数组的关系:
        JSON对象可以嵌套JSON数组
        JSON数组可以嵌套JSON对象
        JSON对象可以嵌套JSON对象
        JSON数组可以嵌套JSON数组
下面是一个json格式的文件,(格式内容大家可以直接去网上去搜索json格式验证)
{  
    "error_code": 0, 
    "reason": "请求成功!",
    "result": [ 
        {
            "day": 1,  
            "des": "1907年11月1日 电影导演吴永刚诞生   吴永刚,1907年11月1日生于江苏吴县。1932年后参加影片《三个摩登女性》、《母性之光》的拍摄工作。1934年在联华影片公司编导处女作《神女》,一举成名,...", 
            "id": 9000,  
            "lunar": "丁未年九月廿六",
            "month": 11,  
            "pic": "",  
            "title": "电影导演吴永刚诞生", 
            "year": 1907  
        },
        {
            "day": 1,
            "des": "1902年11月1日 挪威作家格里格诞生   格里格,1902年11月1日生于卑尔根。挪威作家。   青年时代在奥斯陆和牛津求学,好旅行。1924年出版描写海员生活的小说《航船在前进》。1926年至1927年在...",
            "id": 9010,
            "lunar": "壬寅年十月初二",
            "month": 11,
            "pic": "",
            "title": "挪威作家格里格诞生",
            "year": 1902
        },
        {
            "day": 1,
            "des": "1911年11月1日,清廷宣布解散皇族内阁,任命袁世凯为内阁总理大臣,要他赶快从前线回京,筹组“责任内阁”。11月13日,袁世凯抵达北京,16日组织新内阁,以梁郭彦为外务大臣,赵秉钧为民政大臣,...",
            "id": 3577,
            "lunar": "辛亥年九月十一",
            "month": 11,
            "pic": "",
            "title": "袁世凯出任清朝内阁总理大臣",
            "year": 1911
        }
    ]
}
从上面的格式可以看出:JSON数据都是键值对(key-value),可以通过键来获取对应的值
在QT中,对于Json数据的接口,我们通常使用面向对象的思想来描述
JSON文件 ------ 后缀(json)--------QJsonDocument --------比如:hello.json
JSON对象 -----QJsonObject
JSON数组 ------ QJsonArray
关于json接口类属于QT += core中

二、解析Json的步骤:

        1.将JSON文件转换成QJsonDocument对象,具体来讲,是将json文件中的
数据转换成 json文档对象(QJsonDocument )
        
        对应函数
QJsonDocument
fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
        ① 功能:
                将QByteArray &json转换成QJsonDocument
        ②参数:
                QByteArray &json ------- json数据,它可以从JSON文件中进行读取
        
        2.从QJsonDocument对象中将JSON数据拿出来
        对于 于QJsonDocument中,只有两个部分组成:QJsonArray和 QJsonObject
        
QJsonObject object() const

        功能:从QJsonDocument中得到一个QJsonObject

QJsonArray array() const

        功能:从QJsonDocument中得到一个QJsonArray

        
        3. 要根据提供的数据格式来解析数据(下面代码就是根据上面的json文件进行解析的)
//1 读取文件中数据
     QFile file("../qt_day6_1_json_parser/text.json");

     if(file.open(QIODevice::ReadOnly))
     {

       QByteArray array =  file.readAll();

       //2. 数据解析 ---- 从文档的最外层开始,一层一层往里进行解析,遇见 "{" --- 就使用QJsonObject 遇见 "["--- 就使用QJsonArray
       //然后真正去获取值时,要通过键值对的键来进行,键是字符串类型--- value(QString key),最后,根据数据的类型通过to系统方法来转换完成
       //第一步:将字节数组转换成json文档
       QJsonDocument doc =  QJsonDocument::fromJson(array);

       //第二步:QJsonDocument文档类中,包括了json对象和json数据这两个成员,所以就有两对象set/get函数

      // QJsonObject object() const 和 void setObject(const QJsonObject &object)

      // void setArray(const QJsonArray &array)  QJsonArray array() const
       //根据json数据格式,最外面是json对象({})还是json数组([]),如果是json对象,则使用QJsonObject object() const
       QJsonObject object =  doc.object();
       //第三步:不管是json对象还是json数组,它们里面的数据都是键值对组成,所以,就可以通过键来获了对应的值 --- value
       //QJsonValue value(const QString &key) const  QJsonValue是可以转换成数字  字符串 和对象 数组,是
       //通过这个类的to****()方法来完成
       QJsonArray resultArray = object.value("result").toArray(); //如果是json数组的话,跟数组的概念完全相同
       //通过for循环来遍历 数据
       for (int i=0;i<resultArray.size();i++) {

          QJsonObject resultObject =  resultArray.at(i).toObject();

           QString title = resultObject.value("title").toString();
           int year = resultObject.value("year").toInt();
           qDebug() << "title = " << title;
           qDebug() << "year = " << year;
       }

     }

     file.close();

三、解析数据时常用的接口

1.对于 QJsonDocument类:
        ①解析时:
QJsonArray array() const //通过get方法,得到QJsonDocument类中的json 数组

QJsonObject object() const//通过get方法,得到QJsonDocument类中的json 对象

        ②打包时

void setArray(const QJsonArray &array)//将QJsonArray打包到 QJsonDocument中

void setObject(const QJsonObject &object)

        ③将QJsonDocument和QByteArray相互转换的接口:

静态成员函数:

QJsonDocumen t fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
功能:将 QByteArray数据转换成QJsonDocument
参数说明:
const QByteArray & json ------ 从JSON文件中读取的数据
QJsonParseError * error ----- QByteArray在转换成 QJsonDocument,出错时,它的出错信息 做为一个输出参数
        
         ④ 将QJsonDocment转换成QByteArray
普通成员函数:
QByteArray toJson() const
QByteArray toJson(QJsonDocument::JsonFor mat format) const
功能:将QJsonDocment转换 成QByteArray,以便将数据写入到json文件中
2.QJsonArray类
①获取json数组中的数据元素
QJsonValue at(int i) const
参数说明:
int i ----- 数据元素的下标
返回值:
成功返回一个 QJsonValue
QJsonValue它是json中封装的一个数据类型,类似于int,char ,它可以跟int 、double、QString QJsonArray QJsonObject之间可以相互转换
它代表以下6种类型之一:

 

它们的相互之间的转换使用to方法:
QJsonArray toArray(const QJsonArray &defaultValue) const 

QJsonArray toArray() const 

bool toBool(bool defaultValue = false) const 

double toDouble(double defaultValue = 0) const 

int toInt(int defaultValue = 0) const 

QJsonObject toObject(const QJsonObject &defaultValue) const 

QJsonObject toObject() const QString toString() const 

QString toString(const QString &defaultValue) const

获取数组中 元素的个数

int size() const

3. QJsonObject类:
根据键值来获得真正的数据
QJsonValue value(const QString &key) const
QJsonValue value(QLatin1String key) const
参数说明:
const QString & key ------->键值就来源于json数据文档中键---- 都是字符串类型
比如:
"genres": "动作/惊悚/科幻", ------ genres它就是键(key)
如果该键对应值为字符串,那么可以通过 toString () const
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值