Qt - Json解析与构建


1. JSON 有什么作用?

  • 🐧① JSON 即为 JS对象表示法(因为它和 JS中对象的写法很相似),与JavaScript是没啥关系的;

  • 🐧② JSON 本质是一种特殊格式的字符串;

  • 🐧③ JSON 是一种轻量级的数据交互格式,客户端和服务端数据交互,基本都是JSON格式;

2. JSON 的特点

  • ① 便于阅读和书写除JSON外,还有一种数据交互的格式 XML,但是JSON更便于书写和阅读

  • ② 独立于编程语言,几乎所有的编程语言和开发环境中,都有生成和解析 JSON字符串的库

  • ③ 网络传输的标准数据格式

 

3. JSON 的两种数据格式

  • JSON有两种数据格式:
    ⚽ JSON 对象,被 { }包裹
    ⚽ JSON 数组,被 [] 包裹

 

3.1 JSON 数组

  • 🍎JSON 数组中可以放置任意的类型,可以在数组中放置 JSON对象,JSON数组

3.2 JSON 对象

  • 🍎 JSON 对象是键值对的形式,键的类型是字符串,值的类型可以为数组对象整形浮点型

4. Qt 中如何使用 JSON 呢?

在Qt库中,为JSON的相关操作提供了完整的类支持,包括QJsonValue,QJsonObject,QJsonArray,QJsonDocument和QJsonParseError。其中,QJsonValue类表示json格式中的一个值;QJsonObject表示一个json对象;QJsonArray顾名思义表示一个json数组;QJsonDocument主要用来读写json文档;而QJsonParseError是用来表示json解析过程中出现的错误的方便类。

4.1 QJsonObject

 

4.2 QJsonArray

 

4.3 QJsonValue

 

4.4 QJsonDocument

 

5. 构建 JSON 字符串

#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

#include <QDebug>
#include <QFile>

void writeJson()
{
    QJsonObject rootQJsonObject;

    // 插入 name 字段
    rootQJsonObject.insert("name", "China");

    // 插入 info 字段
    QJsonObject infoQJsonObject;

    infoQJsonObject.insert("capital", "beijing");
    infoQJsonObject.insert("asian", true);
    infoQJsonObject.insert("founded", "1949");
    rootQJsonObject.insert("info", infoQJsonObject);

    // 插入 provinces 字段
    QJsonArray provincesArray;
    QJsonObject sdProvincesQJsonObject;

    sdProvincesQJsonObject.insert("name", "shangdong");
    sdProvincesQJsonObject.insert("capital", "jinan");

    QJsonObject zjProvincesQJsonObject;

    zjProvincesQJsonObject.insert("name", "zhejiang");
    zjProvincesQJsonObject.insert("capital", "hangzhou");

    provincesArray.append(sdProvincesQJsonObject);
    provincesArray.append(zjProvincesQJsonObject);

    rootQJsonObject.insert("provinces", provincesArray);


    // 把 json 对象转换成为 字符串
    QJsonDocument doc(rootQJsonObject);
    QByteArray json = doc.toJson();

    // 打印输出
    qDebug() << QString(json).toUtf8().data();

    // 将 json 字符串写入到文件
    QFile file("d:\\china.json");
    file.open(QFile::WriteOnly);
    file.write(json);
    file.close();

}

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

    writeJson();

    return a.exec();
}

 

6. 解析 JSON 字符串


#include <QCoreApplication>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

#include <QDebug>

void readJson()
{
    // 1. 读取文件
    QFile file("d:\\china.json");
    file.open(QFile::ReadOnly);

    QByteArray json = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(json);

    if (!doc.isObject()) {
        qDebug() << " Not an object";
        return;
    }

    QJsonObject obj = doc.object();
    QStringList keys = obj.keys();

    for (int i = 0; i < keys.size(); i ++)
    {
        // 获取 key - value
        QString key = keys[i];
        QJsonValue value = obj.value(key);

        if (value.isBool()){
            qDebug() << "key : " << key << "  value : " << value.toBool();
        } else if (value.isDouble()) {
            qDebug() << "key : " << key << "  value : " << value.toDouble();
        } else if (value.isString()) {
            qDebug() << "key : " << key << "  value : " << value.toString();
        } else if (value.isObject()) {

            qDebug() << key << ":";

            QJsonObject infoObject = value.toObject();

            QString capital = infoObject["capital"].toString();
            bool asian = infoObject["asian"].toBool();
            QString founded = infoObject["founded"].toString();

            qDebug() << "capital : " << capital;
            qDebug() << "asian : " << asian;
            qDebug() << "founded" << founded;
        } else if (value.isArray()){

            QJsonArray provincesArray = value.toArray();

            for (int i = 0; i < provincesArray.size(); i ++)
            {
                QJsonObject sdJsonObject = provincesArray[i].toObject();
              

                qDebug() <<"name:  " << sdJsonObject["name"].toString();
                qDebug() <<"capital:  " << sdJsonObject["capital"].toString();



            }

        }

    }
}


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

    readJson();

    return a.exec();
}

 

 

json数据格式示例:

{  
  "name": "Alice",  
  "age": 30,  
  "isStudent": false,  
  "courses": [  
    {  
      "courseName": "Mathematics",  
      "credits": 3,  
      "instructor": {  
        "name": "Dr. Smith",  
        "email": "smith@example.com"  
      }  
    },  
    {  
      "courseName": "Physics",  
      "credits": 4,  
      "instructor": {  
        "name": "Dr. Johnson",  
        "email": "johnson@example.com"  
      }  
    }  
  ]  
}

怎么将上面的JSON语句用Qt构建出来呢,可以利用JSON解析工具来理清结构:https://jsontool.cn/

 

 

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/Hou_lang_LJ/article/details/140624636

posted @ 2024-12-05 10:58  [BORUTO]  阅读(9)  评论(0编辑  收藏  举报