您的位置:

深度剖析qjsondocument

一、qjsondocument简介

qjsondocument是Qt中提供的用于JSON文档的读写和操作的类。它是通过解析JSON数据,将其转化为一个QVariant类型的值,并通过相关的函数提取和操作JSON数据的类。

qjsondocument所支持的JSON类型如下:

  • 对象(Object)
  • 数组(Array)
  • 字符串(String)
  • 整数(Integer)
  • 浮点数(Double)
  • 布尔值(Boolean)
  • 空(Null)

下面是一个简单的JSON文档示例:

{
    "name": "Lily",
    "age": 18,
    "score": {
        "chinese": 90,
        "math": 95,
        "english": 98
    },
    "married": false,
    "hobbies": ["reading", "traveling", "swimming"]
}

使用qjsondocument读取该JSON文档:

QJsonDocument doc = QJsonDocument::fromJson(jsonText.toUtf8());
QJsonObject obj = doc.object();

QString name = obj.value("name").toString();
int age = obj.value("age").toInt();

QJsonObject score = obj.value("score").toObject();
int chineseScore = score.value("chinese").toDouble();
int mathScore = score.value("math").toDouble();
int englishScore = score.value("english").toDouble();

bool married = obj.value("married").toBool();

QJsonArray hobbies = obj.value("hobbies").toArray();
QStringList hobbyList;
for(auto hobby : hobbies){
    hobbyList.append(hobby.toString());
}

以上代码即可读取JSON文档中的数据,并保存到对应的变量中。

二、qjsondocument的操作

1、创建JSON文档

我们可以通过QJsonObject、QJsonArray、QJsonValue这三个类,分别来创建一个包含不同JSON类型数据的JSON文档。

下面是一个使用QJsonObject、QJsonArray、QJsonValue创建JSON文档的例子:

QJsonObject person;
person.insert("name", "John");
person.insert("age", 32);

QStringList fruits = {"apple", "banana", "orange"};
QJsonArray fruitArray;
for(auto fruit : fruits){
    fruitArray.append(fruit);
}

person.insert("fruits", fruitArray);

QJsonDocument doc(person);

通过以上代码,我们创建了一个JSON文档,它包含了名为“name”和“age”的两个键值对,以及一个名为“fruits”的键值对,它的值是一个QJsonArray类型,包含了3个字符串元素。

2、读取JSON数据

我们可以使用QJsonObject、QJsonArray、QJsonValue这三个类,来快速读取JSON文档中的对应数据。

下面是一个使用QJsonObject、QJsonArray、QJsonValue读取JSON文档数据的例子:

QJsonDocument doc = QJsonDocument::fromJson(jsonText.toUtf8());
QJsonObject obj = doc.object();

QString name = obj.value("name").toString();
int age = obj.value("age").toInt();

QJsonObject score = obj.value("score").toObject();
int chineseScore = score.value("chinese").toDouble();
int mathScore = score.value("math").toDouble();
int englishScore = score.value("english").toDouble();

bool married = obj.value("married").toBool();

QJsonArray hobbies = obj.value("hobbies").toArray();
QStringList hobbyList;
for(auto hobby : hobbies){
    hobbyList.append(hobby.toString());
}

通过以上代码,我们可以快速读取JSON文档中指定键值对的值,以及从JSON数组中读取元素。

3、写入JSON数据

我们可以通过QJsonObject、QJsonArray、QJsonValue这三个类,来快速写入JSON数据。

下面是一个使用QJsonObject、QJsonArray、QJsonValue写入JSON数据的例子:

QJsonObject person;
person.insert("name", "John");
person.insert("age", 32);

QStringList fruits = {"apple", "banana", "orange"};
QJsonArray fruitArray;
for(auto fruit : fruits){
    fruitArray.append(fruit);
}

person.insert("fruits", fruitArray);

QJsonDocument doc(person);

通过以上代码,我们可以快速写入JSON文档中指定键值对的值,以及将数据写入到JSON数组中。

三、qjsondocument的使用

下面是一个完整的JSON文档读取、处理和写入的例子:

#include 
#include 
   
#include 
    
#include 
     
#include 
      

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

    //读取JSON文档
    QString jsonText = "{\"name\": \"Lily\", \"age\": 18, \"score\": {\"chinese\": 90, \"math\": 95, \"english\": 98}, \"married\": false, \"hobbies\": [\"reading\", \"traveling\", \"swimming\"]}";
    QJsonDocument doc = QJsonDocument::fromJson(jsonText.toUtf8());
    QJsonObject obj = doc.object();

    //处理JSON数据
    QString name = obj.value("name").toString();
    int age = obj.value("age").toInt();

    QJsonObject score = obj.value("score").toObject();
    int chineseScore = score.value("chinese").toDouble();
    int mathScore = score.value("math").toDouble();
    int englishScore = score.value("english").toDouble();

    bool married = obj.value("married").toBool();

    QJsonArray hobbies = obj.value("hobbies").toArray();
    QStringList hobbyList;
    for(auto hobby : hobbies){
        hobbyList.append(hobby.toString());
    }

    //写入JSON数据
    QJsonObject newScore;
    newScore.insert("chinese", chineseScore + 5);
    newScore.insert("math", mathScore + 10);
    newScore.insert("english", englishScore + 8);

    obj.insert("score", newScore);

    QJsonArray newHobbies;
    newHobbies.append("painting");
    newHobbies.append("dancing");

    obj.insert("hobbies", newHobbies);

    QJsonDocument newDoc(obj);

    qDebug() << newDoc.toJson(QJsonDocument::Compact);

    return a.exec();
}

      
     
    
   
  

使用以上代码,我们可以完整地读取JSON文档中的数据,对其进行相关操作,并最终将数据写入到JSON文档中。在调式窗口中,我们可以看到更新后的JSON文档内容。

四、QJsonDocument的注意事项

使用QJsonDocument时需要注意以下几点:

  • 在读取JSON文档时,一定要保证JSON数据格式正确,否则会引起读取失败。
  • QJsonDocument在存储JSON数据时,并不保证JSON数据的格式和顺序。因此,对于需要保证JSON数据格式和顺序的场合,需要自行编写相关代码。
  • qjsondocument在读取JSON数据时,会自动将数字型、逻辑型等数据类型转化为QVariant类型。因此,在进行数据读取时,需要根据具体数据类型进行相应的类型转换,以便进行相关操作。

五、总结

本文主要介绍了qjsondocument的基本用法。我们可以通过qjsondocument很方便地将JSON数据序列化和反序列化,并对其进行相关操作。在使用qjsondocument时,需要注意JSON数据格式的正确性,同时在读取数据时要进行类型转换,以便进行相关操作。