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的基本过程,有兴趣读者可以到点击打开链接下载工程文件,希望对大家有所帮助。


### 回答1: QT 是一种跨平台的应用程序开发框架,支持多种编程语言,如C++和Python等。JSON(JavaScript Object Notation)是一种常用的数据交换格式,常用于Web开发数据的传输和存储。 在QT已经有JSON保存值的方式可以通过QJsonDocument类来实现。使用该类可以方便地对JSON数据进行读写操作。下面是一个简单的示例: ```cpp #include <QJsonDocument> #include <QJsonObject> #include <QJsonValue> #include <QFile> #include <QDebug> int main() { // 创建一个JSON对象并添加键值对 QJsonObject jsonObj; jsonObj["name"] = "张三"; jsonObj["age"] = 20; jsonObj["gender"] = "男"; // 将JSON对象转换为JSON文档 QJsonDocument jsonDoc(jsonObj); // 将JSON文档保存文件 QFile file("data.json"); if (file.open(QIODevice::WriteOnly)) { file.write(jsonDoc.toJson()); file.close(); qDebug() << "保存成功"; } else { qDebug() << "保存失败"; } return 0; } ``` 以上代码创建了一个JSON对象,并向其添加了三个键值对。然后使用QJsonDocument将JSON对象转换为JSON文档,再将文档保存文件保存成功后会输出"保存成功",否则输出"保存失败"。 通过以上方式,QT可以方便地将数据保存JSON格式,便于之后的读取和处理。同时,QT还提供了丰富的JSON解析和操作的API,可以灵活地进行JSON数据的处理和使用。 ### 回答2: Qt是一个用于开发跨平台应用程序的框架,它提供了许多方便的工具和库来简化应用程序开发过程。 在Qt,可以使用QObject类及其派生类来保存和处理JSON数据。QObject类是Qt框架的核心类之一,它提供了信号和槽机制,用于实现对象之间的通信。 要保存JSON值,我们可以使用QJsonDocument类。QJsonDocument类提供了将JSON数据转换为Qt所支持的数据类型(如QVariant、QList和QMap)以及将Qt数据类型转换为JSON的功能。 下面是一个使用Qt保存JSON值的示例: ```cpp #include <QJsonDocument> #include <QJsonObject> #include <QJsonValue> int main() { // 创建一个JSON对象 QJsonObject jsonObject; jsonObject["name"] = "Alice"; jsonObject["age"] = 25; // 创建一个JSON文档并将JSON对象保存到文档 QJsonDocument jsonDocument(jsonObject); // 将JSON文档转换为字符串 QString jsonString = jsonDocument.toJson(); // 输出JSON字符串 qDebug() << jsonString; return 0; } ``` 在上述示例,我们首先创建了一个QJsonObject对象,然后向其添加了两个键值对,分别表示姓名和年龄。接下来,我们创建了一个QJsonDocument对象,并将QJsonObject保存到其。最后,我们使用toJson()函数将QJsonDocument对象转换为字符串,并通过qDebug输出。 使用上述方式,我们可以将JSON保存为字符串,方便在需要的时候进行读取和传输。当需要从字符串读取JSON值时,我们可以使用QJsonDocument的fromJson()函数将字符串转换为QJsonDocument对象,然后使用toVariant()、toObject()等函数将其转换为Qt所支持的数据类型。 ### 回答3: Qt是一个跨平台的C++图形用户界面应用程序开发框架。在Qt,我们可以使用Json保存和读取值。 首先,我们需要包含QtJson类库头文件: ```c++ #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QDebug> ``` 假设我们已经有一个Json字符串,可以通过如下方式将其转换为Json对象: ```c++ QString jsonString = "{\"name\":\"Tom\", \"age\":20}"; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8()); QJsonObject jsonObj = jsonDoc.object(); ``` 现在,我们已经获取到了Json对象,可以通过指定的键来获取对应的值: ```c++ QString name = jsonObj["name"].toString(); // 获取"Tom" int age = jsonObj["age"].toInt(); // 获取20 ``` 如果我们想要修改已保存Json值,可以这样做: ```c++ jsonObj["age"] = 21; // 修改age的值为21 ``` 最后,我们可以将更新后的Json对象转换为字符串,用于保存或传输: ```c++ jsonDoc.setObject(jsonObj); QString newJsonString = jsonDoc.toJson(QJsonDocument::Compact); qDebug() << newJsonString; // 输出:{"name":"Tom","age":21} ``` 总之,Qt提供了丰富的Json类库,可以方便地保存和读取值。我们只需将Json字符串转换为Json对象,然后通过键来获取或修改对应的值,最后再将更新后的Json对象转换为字符串即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值