首页 > 其他分享 >Qt Json详细介绍

Qt Json详细介绍

时间:2024-07-04 19:26:41浏览次数:8  
标签:详细 personObject Qt JSON Json QString 数组 qDebug include

一.概念介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它具有以下特点:

  1. 易读性:JSON 使用人类可读的文本格式表示数据,采用键值对的方式组织数据,易于阅读和编辑。

  2. 轻量级:JSON 数据格式较为简洁,不包含冗余信息,适合网络传输和存储。

  3. 自描述性:JSON 数据的结构清晰明了,键值对以及数组的嵌套结构能够清晰地表示复杂数据。

  4. 易于解析:JSON 数据可以方便地被解析成多种编程语言中的数据结构,如对象、数组等。

  5. 跨平台兼容:由于 JSON 是一种文本格式,不依赖特定的编程语言,能够被多种编程语言解析和生成。

JSON 数据通常由对象(Object)和数组(Array)组成:

  • 对象(Object):由一组键值对构成,使用大括号 {} 表示。示例:{“name”: “Alice”, “age”: 30}
  • 数组(Array):由一组值构成,使用中括号 [] 表示。数组中的元素可以是对象、数组或基本数据类型。示例:[“apple”, “banana”, “cherry”]

总之,JSON 是一种简单、轻量级、易读的数据交换格式,被广泛应用于 Web 开发、API 设计和数据交换等领域。通过了解 JSON 的基本概念和语法规则,可以更好地进行数据交互与处理。

二.重要的部分介绍

1. QJsonDocument:

  • QJsonDocument 类用于表示整个 JSON 文档,可以包含一个 JSON 对象或一个 JSON 数组。
  • 可以使用该类来创建、读取、写入和操作 JSON 数据。
  • 成员函数:toJson() 将 JSON 文档转换为字符串,fromJson() 从字符串中解析 JSON 数据。

示例代码如下:

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

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

    // 创建 JSON 对象
    QJsonObject personObject;
    personObject["name"] = "Alice";
    personObject["age"] = 30;
    personObject["isStudent"] = true;

    QJsonArray fruitsArray = {"apple", "banana", "cherry"};
    personObject["favoriteFruits"] = fruitsArray;

    QJsonObject addressObject;
    addressObject["city"] = "New York";
    addressObject["zipcode"] = "10001";
    personObject["address"] = addressObject;

    // 将 JSON 对象转换为 JSON 文档
    QJsonDocument jsonDocument(personObject);

    // 将 JSON 文档转换为 JSON 字符串
    QString jsonString = jsonDocument.toJson();

    qDebug() << "Generated JSON string:" << jsonString;

    // 解析 JSON 字符串为 JSON 文档
    QJsonDocument parsedDocument = QJsonDocument::fromJson(jsonString.toUtf8());

    if (!parsedDocument.isNull() && parsedDocument.isObject()) {
        QJsonObject parsedObject = parsedDocument.object();

        QString name = parsedObject["name"].toString();
        int age = parsedObject["age"].toInt();
        bool isStudent = parsedObject["isStudent"].toBool();

        qDebug() << "Parsed name:" << name;
        qDebug() << "Parsed age:" << age;
        qDebug() << "Parsed isStudent:" << isStudent;
    } else {
        qDebug() << "Failed to parse JSON";
    }

    return a.exec();
}

2.QJsonObject(这和map很相似)

  • QJsonObject 类用于表示 JSON 对象,它是键值对的集合,其中键为字符串,值可以是字符串、整数、布尔值、对象或数组。
  • 可以通过下标操作符 [] 或 insert() 方法来添加键值对。
  • 成员函数:value() 可以获取指定键对应的值,contains() 用于检查是否包含指定键。

示例代码如下:

#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

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

    // 创建一个空的 JSON 对象
    QJsonObject personObject;

    // 添加键值对到 JSON 对象
    personObject["name"] = "Alice";
    personObject["age"] = 30;
    personObject["isStudent"] = true;

    // 创建包含一组值的 JSON 数组
    QJsonArray fruitsArray = {"apple", "banana", "cherry"};
    personObject["favoriteFruits"] = fruitsArray;

    // 创建一个嵌套的 JSON 对象
    QJsonObject addressObject;
    addressObject["city"] = "New York";
    addressObject["zipcode"] = "10001";
    personObject["address"] = addressObject;

    // 访问和输出 JSON 对象中的值
    qDebug() << "Name:" << personObject["name"].toString();
    qDebug() << "Age:" << personObject["age"].toInt();
    qDebug() << "Is Student:" << personObject["isStudent"].toBool();

    // 访问嵌套的 JSON 对象中的值
    QJsonObject nestedAddress = personObject["address"].toObject();
    qDebug() << "City:" << nestedAddress["city"].toString();
    qDebug() << "Zipcode:" << nestedAddress["zipcode"].toString();

    // 修改 JSON 对象中的值
    personObject["age"] = 35;

    // 移除 JSON 对象中的某个键值对
    personObject.remove("isStudent");

    // 转换 JSON 对象为字符串
    QJsonDocument jsonDocument(personObject);
    QString jsonString = jsonDocument.toJson();

    qDebug() << "Updated JSON object:" << jsonString;

    return a.exec();
}

3. QJsonArray

  • QJsonArray 类用于表示 JSON 数组,它是值的有序集合,值可以是字符串、整数、布尔值、对象或数组。
  • 可以使用 append()、insert()、at() 等方法操作数组元素。
  • 成员函数:size() 返回数组中元素的数量,at() 根据索引获取指定位置的元素。
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

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

    // 创建一个空的 JSON 数组
    QJsonArray fruitsArray;

    // 向 JSON 数组添加元素
    fruitsArray.append("apple");
    fruitsArray.append("banana");
    fruitsArray.append("cherry");

    // 创建一个包含多个不同类型元素的 JSON 数组
    QJsonArray mixedArray;
    mixedArray.append(10);
    mixedArray.append(true);
    mixedArray.append("hello");

    // 输出数组元素
    qDebug() << "Fruits in the array:";
    for(const QJsonValue &value : fruitsArray) {
        qDebug() << value.toString();
    }

    qDebug() << "Elements in mixed array:";
    for(const QJsonValue &value : mixedArray) {
        if(value.isBool()) {
            qDebug() << value.toBool();
        } else if(value.isDouble()) {
            qDebug() << value.toDouble();
        } else if(value.isString()) {
            qDebug() << value.toString();
        }
    }

    // 访问数组元素
    qDebug() << "First fruit:" << fruitsArray.at(0).toString();
    qDebug() << "Last fruit:" << fruitsArray.last().toString();

    // 修改数组元素
    fruitsArray.replace(1, "pear");

    // 移除数组元素
    fruitsArray.removeAt(2);

    // 转换 JSON 数组为字符串
    QJsonDocument jsonDocument(fruitsArray);
    QString jsonString = jsonDocument.toJson();

    qDebug() << "Updated JSON array:" << jsonString;

    return a.exec();
}

4.JSON 数据的解析

  • 使用 QJsonDocument::fromJson() 将 JSON 字符串解析为 QJsonDocument 对象。
  • 判断解析后的对象类型(是对象还是数组),然后获取各个属性的值。

5. QString与QByteArray

在 Qt 中,QString 和 QByteArray 是两种用于处理字符串数据的类,它们在存储和操作字符串上有一些不同之处。下面是关于 QString 和 QByteArray 的详细介绍:

QString

  • QString 是 Qt 中用于表示 Unicode 字符串的类,它支持多种字符编码,包括 UTF-8、UTF-16 等。

  • 特点:

  1. 支持 Unicode 字符,可以表示任意国家地区的字符。
  2. 自动转码:QString 会自动处理不同字符编码之间的转换。例如,可以使用 toUtf8() 方法将 QString 转换为 QByteArray。
  3. 提供了丰富的字符串操作方法,如拼接、查找、替换、大小写转换等。

使用场景:

  • 存储用户界面文本、表示用户输入。
  • 作为跨平台的字符串处理工具,便于处理各种字符编码和国际化需求。

QByteArray

  • QByteArray 是 Qt 中用于表示字节数据的类,通常用于存储二进制数据或者不包含特定字符编码的文本数据。

特点:

  1. 与 QString 不同,QByteArray 主要是字节级别的操作,适用于处理二进制数据。
  2. 通常用于读写文件、网络数据、加密解密等场景。
  3. 字节数据一般不涉及字符编码的转换,更适合存储不特定编码的数据。

使用场景:

  • 存储二进制数据,如图片、音频、视频等。
  • 读写文件内容,处理网络数据传输。
  • 加密解密操作等需要处理字节数据的场景。

总结

  • 如果需要处理文本数据,并且涉及到字符串操作、多语言支持或者用户界面相关的文本处理,通常使用 QString。

  • 如果处理的数据为字节数据、二进制数据或者不需要特定字符编码的数据,可以使用 QByteArray。

三.JSON读写文件实战

  • Json格式如下:
{
    "Name":"Ace",
    "Sex":"man",
    "Age":20,
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}
  • 写文件
void MainWindow::writeJson()
{
    //创建一个Json对象
    QJsonObject obj;//对象可以说是和map一模一样

    //"Ace"发生了隐式类型转换
    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");


    //构建一个Json数组的对象
    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");


    //将json的对象转换成文档类型
    QJsonDocument doc(obj);

    //将其转换成字符串类型,QByteArray在qt中就是表示字符串
    QByteArray json = doc.toJson();

    //写入磁盘文件中
    QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");

    file.open(QFile::WriteOnly);

    file.write(json);

    file.close();


}
  • 读文件
void MainWindow::readJson()
{
    //读文件
    QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");

    file.open(QFile::ReadOnly);

    QByteArray all = file.readAll();

    file.close();

    //读出的文件进行转换
    QJsonDocument doc = QJsonDocument::fromJson(all);

    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();
                          }
                      }
                  }
              }
          }
      }
}

标签:详细,personObject,Qt,JSON,Json,QString,数组,qDebug,include
From: https://blog.csdn.net/qq_71286244/article/details/140187617

相关文章

  • Java中的JSON神器,如何轻松玩转复杂数据结构
    哈喽,大家好,我是木头左!一、揭秘JSON世界的基石在Java的世界中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于机器解析和生成。JSON在日常开发中的应用非常广泛,无论是前后端的数据交互,还是配置文件的读取,都离不开JSON的身影。那......
  • 云服务器部署flask项目详细步骤
    云服务器部署flask项目详细步骤,从服务器选择开始(本文选用的是阿里云)1.购买服务器,我们目前选择镜像Ubuntu16.0464位的系统,因为这个系统目前运行比较稳定 2.设置远程链接密码 如果忘了自己的ssh链接密码,可以以下地方重置密码3.添加安全组 添加5000端口,添加80端口,有的......
  • 最有效的ResultSet转换为JSON?
    最有效的ResultSet转换为JSON? 原文链接: https://cloud.tencent.com/developer/information/%E6%9C%80%E6%9C%89%E6%95%88%E7%9A%84ResultSet%E8%BD%AC%E6%8D%A2%E4%B8%BAJSON%EF%BC%9F-article最有效的ResultSet转换为JSON的方法是使用Java中的Jackson库。Jackson是一个......
  • QThread::run函数的使用(涉及到QThread::run, Qthread::start,protected,virtual虚函数,o
    RobotCommuServer.h#ifndefROBOTCOMMUSERVER_H#defineROBOTCOMMUSERVER_H#include<QThread>classRobotCommuServer:publicQThread{Q_OBJECTpublic:explicitRobotCommuServer(QObject*parent=nullptr);~RobotCommuServer();void......
  • 软件开发资料汇总(规格说明书、详细设计、测试计划、验收报告)
       前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是各个阶段的文档资料概述:软件项目管理部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求......
  • Winform中使用HttpClient实现调用http的post接口并设置传参content-type为application
    场景Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124157296上面使用HttpClient调用post接口时使用的HttpContent的格式为application/x-www-form-urlencoded对应的代码......
  • MQTT专题
    什么是MqttMQTT协议 全称是(MessageQueuingTelemetryTransport),即消息队列遥测传输协议。是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也是具有高可靠、低开......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    想要成为黑客,却苦于没有方向,不知道从何学起,下面这篇黑客入门教程可以帮你实现自己的黑客梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到最后 1、Web安全相关概念(2周)·熟悉基本概念(SQL注入、上传、XSS、、CSRF、一句话木马等)。通过关键字(SOL注入、上传、XSSC......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    想要成为黑客,却苦于没有方向,不知道从何学起,下面这篇黑客入门教程可以帮你实现自己的黑客梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到最后 1、Web安全相关概念(2周)·熟悉基本概念(SQL注入、上传、XSS、、CSRF、一句话木马等)。通过关键字(SOL注入、上传、XSSC......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    想要成为黑客,却苦于没有方向,不知道从何学起,下面这篇黑客入门教程可以帮你实现自己的黑客梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到最后 1、Web安全相关概念(2周)·熟悉基本概念(SQL注入、上传、XSS、、CSRF、一句话木马等)。通过关键字(SOL注入、上传、XSSC......