Qt解析保存Json

    Json是一种在互联网上常用的轻量级的数据交换格式,具有简洁清晰的层次结构。Json与XML类似,但却比后者更小、更快、更容易解析。目前QT也添加了对Json的支持,首先我们来温习一下Json的语法。

Json语法

    Json是纯文本类型,这样可以保证其独立于各类语言。在Json中有6中基本数据类型,分别是:

  • 布尔型(boolean) 
  • 浮点型(double)
  • 字符串型(string)
  • 数组型(array)
  • 对象型(object)
  • 空(null)

    Json基本数据结构为键值对,键为字符串类型,用双引号括起来,值则可以是以上六种数据类型。不同键值对之间使用逗号隔开。若将一个或多个键值对用大括号括起来,则表示一个对象类型。若用方括号将一个或多个基本数据括起来,则表示一个数组类型,所以对于任何一个Json文件,总是包含一个对象型数据或数据型数据。

QT解析保存Json文件

    QT中主要利用QJsonDocument、QjsonObject、QJasonArray和QJsonValue等这几个类来处理Json文件,这几个类是包含在QtCore组件中。下面我们将利用下面的Json文件,来演示如何解析保存Json文件。

{
    "coord": {
        "lat": 39.907501,
        "lon": 116.397232
    },
    "env": {
        "humidity": 34,
        "pressure": 1016,
        "temp": 20
    },
    "name": "Beijing",
    "weather": [
        {
            "description": "晴",
            "main": "Clear"
        }
    ],
    "windspeed": "2"
}

    这个Json文件名为weather.json,里面包含了城市名称及该城市的经纬度、温湿度等天气状况。在解析Json文件之前,首先应当读取该文件内容,代码如下:

void Widget::on_pushButton_read_clicked()
{
    QFile weatherFile("weather.json");
    if(weatherFile.open(QFile::ReadOnly))
    {
        QJsonParseError Jasonerror;
        m_JsonDocument = QJsonDocument::fromJson(weatherFile.readAll(),&Jasonerror);
        if(Jasonerror.error == QJsonParseError::NoError)
        {
           parseJson();
        }
        else
        {
            QMessageBox::warning(this, QStringLiteral("warning"), Jasonerror.errorString());
        }
    }

    weatherFile.close();

}    

    首先我们用QFile打开Json文件,将文件内容保存到QByteArray中,再利用QJsonDocument的静态函QJsonDocument::fromJson将文件内容保存到QJsonDocument中。

void Widget::parseJson()
{
    if(m_JsonDocument.isNull() || m_JsonDocument.isEmpty())
    {
        return;
    }
    if(m_JsonDocument.isObject())
    {
        QMap<QString,QVariant> weatherInfo;

        m_JsonObject = m_JsonDocument.object();
        weatherInfo[QLatin1String("name")] = m_JsonObject[QLatin1String("name")].toVariant();
        weatherInfo[QLatin1String("windspeed")] = m_JsonObject[QLatin1String("windspeed")].toVariant();

        QJsonObject coord = m_JsonObject.value(QLatin1String("coord")).toObject();
        foreach (auto key, coord.keys())
        {
            weatherInfo[key] = coord[key].toVariant();
        }

         QJsonObject env = m_JsonObject.value(QLatin1String("env")).toObject();
         for(auto iter = env.constBegin(); iter != env.constEnd(); iter++)
         {
             weatherInfo[iter.key()] = iter.value().toVariant();
         }

         QJsonArray weather = m_JsonObject.value(QLatin1String("weather")).toArray();
         weatherInfo[QLatin1String("description")] = weather[0].toObject().value(QLatin1String("description")).toVariant();

        ui->lineEdit_city->setText(weatherInfo[QLatin1String("name")].toString());
        ui->lineEdit_lantitude->setText(weatherInfo[QLatin1String("lat")].toString());
        ui->lineEdit_longitude->setText(weatherInfo[QLatin1String("lon")].toString());
        ui->lineEdit_weather->setText(weatherInfo[QLatin1String("description")].toString());
        ui->lineEdit_temperature->setText(weatherInfo[QLatin1String("temp")].toString());
        ui->lineEdit_humidity->setText(weatherInfo[QLatin1String("humidity")].toString());
        ui->lineEdit_windspeed->setText(weatherInfo[QLatin1String("windspeed")].toString());


    }

}

    这部分为Json解析,QJsonDocument并能直接用来解析Json内容,还需转换为我们熟悉的键值对数据结构,QJsonDocument提供了两种转换方式:QJsonDocument::object()和QJsonDocument:toVariant()函数,代码里使用的是前者。QJsonObject是对Json对象模型的封装,QJsonObject提供了三种方式访问键值对数据,分别是数组下标访问、迭代器和value函数。QJsonArray则是对数组类型的封装,可以使用数组下标或迭代器方式访问。

void Widget::on_lineEdit_windspeed_editingFinished()
{
    m_JsonObject[QLatin1String("windspeed")] = QJsonValue(ui->lineEdit_windspeed->text());
}

void Widget::saveJson()
{
    QFile weatherFile("weather.json");
    if(weatherFile.open(QFile::WriteOnly))
    {
        QJsonDocument tmpDocument(m_JsonObject);
        weatherFile.write(tmpDocument.toJson());
        QMessageBox::information(this,QStringLiteral("message"),QString("json保存成功"));
    }
}

    这部分是Json文件保存,我们修改了Json中的一个键值对,注意QJsonObject和QJsonArray都采用隐式共享技术,都是写时复制。代码中我们创建一个临时的QJsonDocument对象保存新的数据,在通过QJsonDocument::toJson()将其转换为QByteArray,最终保存到文件中。

    到这里我们将完成了Qt解析保存Json的基本过程,有兴趣读者可以到点击打开链接下载工程文件,希望对大家有所帮助。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值