您当前的位置: 首页 >  json

龚建波

暂无认证

  • 3浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt读写JSON,以及使用QTreeView展示和编辑JSON数据

龚建波 发布时间:2019-11-22 00:10:14 ,浏览量:3

0.前言

JSON(JavaScript Object Notation)是一种轻量级的结构化数据格式,相对于XML语法更简洁。它具有6种基本数据类型:bool(true或false字符串表示)、double(对应JS中number)、string、array(值的列表)、object(键值对集合)、null 。

虽然cJSON和JsonCpp也是常用的C/C++ JSON解析器,但是在Qt框架中一般用Qt提供的解析类就行了。本文主要介绍QJson的使用,以及使用QTreeView展示和编辑JSON文档(代码链接在最后)。

目录

1.了解QJson

2.解析JSON

3.生成JSON

4.利用QTreeView展示和编辑JSON

5.参考

《偶然》 ----徐志摩

我是天空里的一片云, 偶尔投影在你的波心── 你不必讶异, 更无须欢喜── 在转瞬间消灭了踪影。 你我相逢在黑夜的海上, 你有你的,我有我的,方向; 你记得也好, 最好你忘掉 在这交会时互放的光亮!

1.了解QJson

Qt提供了多个类来分别表示JSON文档、节点、迭代器,这些类都是隐式共享的。

QJsonDocument:用于读写JSON文档。它包装完整的JSON文档,并且可以从基于UTF-8编码的文本表示形式以及Qt自己的二进制格式读取和写入此文档。可以使用QJsonDocument::fromJson() 将JSON文档从其基于文本的表示形式转换为QJsonDocument.toJson() 将其转换回文本。

QJsonParseError:用于表示JSON解析时发生的错误。

QJsonObject:表示键值对列表,其中键是唯一的字符串,而值由QJsonValue表示。QJson还提供了iterator和const_iterator来对QJsonObject进行迭代。要注意的是,一般的JSON结构,object键值对列表是无序的,array才有序,QJSON实现没有提供object有序的设置。

QJsonArray:表示值的列表,值由QJsonValue表示。

QJsonValue:存储数据的值,具有六种基本类型,可通过type() 方法获取其类型枚举:Bool、Double、String、Array、Object、Null,外加一个Undefined表示不确定的值。

在使用这些类时,先添加上对应的头文件。

2.解析JSON

一般常用的操作是读取文件用QByteArray初始化一个QJsonDocument,或者接收来自Http的object、array。下面的代码操作步骤为:读取文件,解析为QJsonDocument,遍历其中的QJsonObject和QJsonArray并获取值。操作起来相当的简单。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

//读取并解析JSON文档
bool LoadJson(const QString &filepath)
{
    //判断路径以及是否正常打开
    if(filepath.isEmpty())
        return false;
    QFile file(filepath);
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
        return false;

    //读取数据后关闭文件
    const QByteArray raw_data=file.readAll();
    file.close();

    //解析为Json文档
    QJsonParseError json_error;
    QJsonDocument json_doc=QJsonDocument::fromJson(raw_data,&json_error);

    //是否正常解析Json数据
    if(json_doc.isNull()||json_doc.isEmpty()||json_error.error!=QJsonParseError::NoError)
        return false;

    //判断是object{}还是array[]的Json
    if(json_doc.isObject()){
        //解析文档中的Object
        const QJsonObject json_obj=json_doc.object();

        //[1]可以遍历object
        QJsonObject::const_iterator iter;
        for (iter = json_obj.constBegin(); iter != json_obj.constEnd(); ++iter){
            qDebug(){0,key},{1,"[Object]"}},JsonTreeItem::Object,item);
    item-appendChild(child);

    //遍历Object的keys
    const QStringList keys=obj.keys();
    for(const QString &item_key:keys){
        //qDebug(){0,key},{1,"[Array]"}},JsonTreeItem::Array,item);
    item-appendChild(child);

    //遍历Array
    for(int i=0;i{0,key},{1,the_val}},JsonTreeItem::Value,item);
    item-appendChild(child);
}
            
关注
打赏
1655829268
查看更多评论
0.0496s