Qt中的JSON

Qt中的JSON

  • 简介
  • JSON对象和数组
    • JSON数组
    • JSON对象
  • Qt中与JSON相关的类

简介

JSON是一种轻量级的数据交换格式,可使人们很容易地进行阅读和编写,同时也方便了机器进行解析和生成,适用于数据交互的场景。JSON并不会限制于编程语言,几乎在所有编程语言和开发环境中,都有解析和生成JSON字符串的库。客户端和服务端交互,基本都是JSON格式的,可以从JSON中解析出需要的数据。

JSON对象和数组

JSON有两种数据格式:JSON对象和JSON数组。
被大括号包裹的是JSON对象,被中括号包裹的是JSON数组。

JSON数组

JSON数组中的元素可以是不同的数据类型,JSON数组可以嵌套JSON数组,也可以嵌套JSON对象。

JSON对象

JSON对象内部使用键值对,键和值之间使用冒号分隔,多个键值之间使用逗号分隔,示例如下:

{
	"key1": value1,
	"key2": value2,
	...
}

键是字符串类型,值的类型可以是多种,其中可以包括JSON数组,JSON对象。JSON对象可以嵌套JSON对象和数组。

Qt中与JSON相关的类

QJsonObject:JSON对象是键值对的列表,键是唯一的字符串,值由QJsonValue表示。

QJsonArray:JSON数组是一个值列表,可以通过从数组中插入和删除QJsonValue来操作该列表。

QJsonValue:该类封装了JSON支持的数据类型。

QJsonDocument:封装了一个完整的JSON文档,并且可以从UTF-8编码的基于文本的表示以及Qt自己的二进制格式读取和写入该文档。

关于 Qt 中 Json 数据对象以及字符串之间的转换的操作流程是固定的,相关的操作是没有太多的技术含量可言的。
例:写文件(来源)

void writeJson()
{
    QJsonObject obj;
    obj.insert("Name", "Ace");
    obj.insert("Sex", "man");
    obj.insert("Age", 20);

    QJsonObject subObj;
    subObj.insert("Father", "Gol·D·Roger");
    subObj.insert("Mother", "Portgas·D·Rouge");
    QJsonArray array;
    array.append("Sabo");
    array.append("Monkey D. Luffy");
    subObj.insert("Brother", array);
    obj.insert("Family", subObj);
    obj.insert("IsAlive", false);
    obj.insert("Comment", "yyds");

    QJsonDocument doc(obj);
    QByteArray json = doc.toJson();

    QFile file("d:\\ace.json");
    file.open(QFile::WriteOnly);
    file.write(json);
    file.close();
}

读文件(来源)

void MainWindow::readJson()
{
    QFile file("d:\\ace.json");
    file.open(QFile::ReadOnly);
    QByteArray json = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(json);
    if(doc.isObject())
    {
        QJsonObject obj = doc.object();
        QStringList keys = obj.keys();
        for(int i=0; i<keys.size(); ++i)
        {
            QString key = keys.at(i);
            QJsonValue value = obj.value(key);
            if(value.isBool())
            {
                qDebug() << key << ":" << value.toBool();
            }
            if(value.isString())
            {
                qDebug() << key << ":" << value.toString();
            }
            if(value.isDouble())
            {
                qDebug() << key << ":" << value.toInt();
            }
            if(value.isObject())
            {
                qDebug()<< key << ":";
                // 直接处理内部键值对, 不再进行类型判断的演示
                QJsonObject subObj = value.toObject();
                QStringList ls = subObj.keys();
                for(int i=0; i<ls.size(); ++i)
                {
                    QJsonValue subVal = subObj.value(ls.at(i));
                    if(subVal.isString())
                    {
                        qDebug() << "   " << ls.at(i) << ":" << subVal.toString();
                    }
                    if(subVal.isArray())
                    {
                        QJsonArray array = subVal.toArray();
                        qDebug() << "   " << ls.at(i) << ":";
                        for(int j=0; j<array.size(); ++j)
                        {
                            // 因为知道数组内部全部为字符串, 不再对元素类型进行判断
                            qDebug() << "       " << array[j].toString();
                        }
                    }
                }
            }
        }
    }
}

你可能感兴趣的:(Qt,qt,c++)