Qt中QJsonObject类

2023-05-16

00. 目录
01. QJsonObject类简介
02. 公有类型
03. 公有成员方法
04. 公有成员方法解析
05. 参考示例
06. 附录
01. QJsonObject类简介
Header:    #include <QJsonObject> 
qmake:    QT += core
Since:    Qt 5.0

​ QJsonObject类用于封装JSON对象。JSON对象是包含键值对的链表,其中键是唯一的字符串,其值由QJsonValue对象。

​ QJsonObject可以与QVariantMap相互转换,可以用size()来获得键值对的数目,insert()、remove()分别用来插入和删除pair。可以用标准C++的迭代器模式(iterator pattern)来迭代其内容。
​ QJsonObject是一个隐式共享的类,只要没有被改变过,QJsonObject会和创建它的document共享数据。

​ 可以通过QJsonDocument将QJsonObject和文本格式相互转换。

02. 公有类型
class    const_iterator
class    iterator
typedef    ConstIterator
typedef    Iterator
typedef    key_type
typedef    mapped_type
typedef    size_type

03. 公有成员方法
QJsonObject()
QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
QJsonObject(const QJsonObject &other)
QJsonObject(QJsonObject &&other)
~QJsonObject()
QJsonObject::iterator    begin()
QJsonObject::const_iterator    begin() const
QJsonObject::const_iterator    constBegin() const
QJsonObject::const_iterator    constEnd() const
QJsonObject::const_iterator    constFind(const QString &key) const
QJsonObject::const_iterator    constFind(QLatin1String key) const
bool    contains(const QString &key) const
bool    contains(QLatin1String key) const
int    count() const
bool    empty() const
QJsonObject::iterator    end()
QJsonObject::const_iterator    end() const
QJsonObject::iterator    erase(QJsonObject::iterator it)
QJsonObject::iterator    find(const QString &key)
QJsonObject::iterator    find(QLatin1String key)
QJsonObject::const_iterator    find(const QString &key) const
QJsonObject::const_iterator    find(QLatin1String key) const
QJsonObject::iterator    insert(const QString &key, const QJsonValue &value)
bool    isEmpty() const
QStringList    keys() const
int    length() const
void    remove(const QString &key)
int    size() const
void    swap(QJsonObject &other)
QJsonValue    take(const QString &key)
QVariantHash    toVariantHash() const
QVariantMap    toVariantMap() const
QJsonValue    value(const QString &key) const
QJsonValue    value(QLatin1String key) const
bool    operator!=(const QJsonObject &other) const
QJsonObject &    operator=(const QJsonObject &other)
QJsonObject &    operator=(QJsonObject &&other)
bool    operator==(const QJsonObject &other) const
QJsonValue    operator[](const QString &key) const
QJsonValue    operator[](QLatin1String key) const
QJsonValueRef    operator[](const QString &key)
QJsonValueRef    operator[](QLatin1String key)

04. 公有成员方法解析
QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
使用键值对链表构建QJsonObject对象

QJsonObject::QJsonObject(const QJsonObject &other)
构建QJsonObject对象
 
iterator QJsonObject::begin()
const_iterator QJsonObject::begin() const
返回指向JSON对象的第一个元素的STL风格的迭代器

const_iterator QJsonObject::constBegin() const
返回指向JSON对象的第一个元素的const STL风格的迭代器

const_iterator QJsonObject::constEnd() const
返回SJON对象的最后一个元素后的位置的const STL风格的迭代器

const_iterator QJsonObject::constFind(const QString &key) const
返回一个指向键值对中键为key的元素的const迭代器

bool QJsonObject::contains(const QString &key) const
如果JSON对象中包含键key,返回true

int QJsonObject::size() const
int QJsonObject::count() const
返回JSON对象中键值对的数量

bool QJsonObject::empty() const
bool QJsonObject::isEmpty() const
如果JSON对象为空,返回true

iterator QJsonObject::find(const QString &key)
const_iterator QJsonObject::find(const QString &key) const
返回指向JSON对象中键为key的键值对的迭代器

[static] QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash)
将hash转换为JSON对象

[static] QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map)
将map转换为JSON对象

iterator QJsonObject::insert(const QString &key, const QJsonValue &value)
插入键为key,值为value的键值对,返回插入键值对的迭代器

QStringList QJsonObject::keys() const
返回JSON对象的所有键的链表

void QJsonObject::remove(const QString &key)
删除JSON对象中的key

QJsonValue QJsonObject::take(const QString &key)
删除JSON对象中的键key,返回key对应的QJsonValue

QVariantHash QJsonObject::toVariantHash() const
将JSON对象转换为QVariantHash

QVariantMap QJsonObject::toVariantMap() const
将JSON对象转换为QVariantMap

QJsonValue QJsonObject::value(const QString &key) const
返回key对应的QJsonValue值

05. 参考示例
简单的JSON对象

{
    "Cross Platform": true,
    "From": 1991,
    "Name": "Qt"
}

生成比较简单,只需要用 QJsonObject 即可。

// 构建 JSON 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("From", 1991);
json.insert("Cross Platform", true);

// 构建 JSON 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);

qDebug() << strJson;

简单的JSON解析

QJsonParseError jsonError;
// 转化为 JSON 文档
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError); 
// 解析未发生错误
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) 
{  
    if (doucment.isObject()) 
    { 
        // JSON 文档为对象
        QJsonObject object = doucment.object();  // 转化为对象
        if (object.contains("Name")) 
        {  // 包含指定的 key
            QJsonValue value = object.value("Name");  // 获取指定 key 对应的 value
            if (value.isString()) 
            {  // 判断 value 是否为字符串
                QString strName = value.toString();  // 将 value 转化为字符串
                qDebug() << "Name : " << strName;
            }
        }
        if (object.contains("From")) 
        {
            QJsonValue value = object.value("From");
            if (value.isDouble()) 
            {
                int nFrom = value.toVariant().toInt();
                qDebug() << "From : " << nFrom;
            }
        }
        if (object.contains("Cross Platform")) 
        {
            QJsonValue value = object.value("Cross Platform");
            if (value.isBool()) 
            {
                bool bCrossPlatform = value.toBool();
                qDebug() << "CrossPlatform : " << bCrossPlatform;
            }
        }
    }
}
/*****************************************************

Qt中使用Json

Qt中使用Json需要一下几个类:

QJsonValue            代表了json格式中的一个值

QJsonObject          代表了json格式的一个对象

QJsonArray            代表了json格式中的数组

QJsonDocument    用来读写json文件

QJsonParseError   用来表示json分析过程的错误

其中QJsonValue支持6中基本的数据类型:

  • bool QJsonValue::Bool
  • double QJsonValue::Double
  • string QJsonValue::String
  • array QJsonValue::Array
  • object QJsonValue::Object
  • null QJsonValue::Null

下面例子表示了json的创建、读取、序列化和反序列化的过程。

其中使用QJsonDocument  可以用来序列化和反序列化的过程,进而实现文件读写、socket的读写。

序列化json的函数:

QByteArray toBinaryData()   

QByteArray toJson(JsonFormat format = Indented)

反序列化:

QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)  

QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)  

QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate) 

QJsonDocument fromVariant(const QVariant &variant)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#include <QCoreApplication>

#include <QDebug>

#include <QJsonObject>

#include <QFile>

#include <QJsonDocument>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    QJsonObject obj;

    obj.insert("name""lily");

    obj.insert("age", 23);

    QJsonObject addr;

    addr.insert("city""guangzhou");

    addr.insert("province""guangdong");

    obj.insert("addr", addr);

    qDebug() << obj<<endl;

    qDebug()<<obj.value("name").toString()<<endl;

    //序列化

    QJsonDocument jsonDoc(obj);

    QByteArray ba = jsonDoc.toJson();

    //反序列化

    QJsonParseError e;

    QJsonDocument jsonDocNew = QJsonDocument::fromJson(ba, &e);

    if(e.error == QJsonParseError::NoError && !jsonDocNew.isNull())

    {

        QJsonObject getObj = jsonDocNew.object();

        qDebug() << getObj<<endl;

    }

    return a.exec();

}

  

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中QJsonObject类 的相关文章

  • 关于qt信号槽传指针与释放指针

    今天 xff0c 意外发现qt中信号槽传指针的方式进行时 xff0c 会发生释放不掉指针所分配的空间的情况 定义一个信号 void emit showTime Data 槽 void slot showTime Data 在发出信号之前动态
  • Qt-信号和槽函数传递自定义参数前需注册自定义数据类型

    Qt 信号和槽函数参数只能是基于 Qt 的基础类型的 xff0c 比如 QString int bool 等 xff0c 如果想传递自定义类型默认情况下是行不通的 要想在 Qt 的信号和槽函数之间传递自定义类型 xff0c 可以先将自己的自
  • Qt 设置窗口背景图片的几种方法实例

    1 在paintEvent事件中绘制图片 void Widget paintEvent QPaintEvent ev QPainter painter this painter drawPixmap rect QPixmap 34 bg j
  • Qt事件处理的几种方式

    Qt提供了5种事件处理和事件过滤的方法 xff1a 1 重写事件处理器函数 这是大部分情况最常用的一种 xff0c 如重写 paintEvent mousePressEvent keyPressEvent 等事件处理器虚函数 2 重写 QO
  • QT中添加图片资源的方法

    1 在ui设计界面中添加label xff0c 用于显示图片 2 添加QT资源文件 往项目中添加新文件 xff0c 选择QT分类中的资源文件 xff0c 名称为 34 myImage 34 其他选项默认 3 添加资源 在项目目录下新建文件夹
  • Q_OBJECT的作用

    只有继承了QObject类的类 xff0c 才具有信号槽的能力 所以 xff0c 为了使用信号槽 xff0c 必须继承QObject 凡是QObject类 xff08 不管是直接子类还是间接子类 xff09 xff0c 都应该在第一行代码写
  • Qt编写自定义控件及插件的使用

    在使用Qt Designer设计窗体界面时 xff0c 我们可以使用Widget Box里的窗体控件非常方便的绘制界面 xff0c 比如拖进去一个按钮 xff0c 一个文本编辑器等 虽然Qt Designer里的控件可以满足我们大部分的需求
  • QT中窗口去掉最大化最小化关闭按钮及菜单的方法

    在QT界面开发过程中 xff0c 有的时候需要隐藏最大化最小化甚至是关闭按钮 xff0c 以排除用户的操作系统无定义 xff0c 让程序流向混乱现总结如下 xff1a 1 Qt的QDialog去掉最大化和最小化以及关闭按钮 xff1a 在构
  • Qt创建右键菜单的方法

    函数 所有派生自QWidget的控件 xff0c 若实现在其上右键单击弹出菜单 xff0c 需要设置该控件的上下文菜单策略函数为setContextMenuPolicy Qt CustomContextMenu xff0c 设置该策略后当用
  • QT 中实现QLabel的点击事件(重写QLabel)

    默认情况下 xff0c QLabel是不支持点击事件的 xff0c 要实现QLabel的点击事件 xff0c 一般有两种方式 xff1a 1 继承QLabel xff0c 重写鼠标点击事件 xff0c 通过发送信号与父窗体实现通讯 Clic
  • flashfxp连接失败,flashfxp连接失败怎么办

    FlashFXP是一款功能强大的FXP FTP软件 xff0c 允许你从任何ftp服务器直接传输文件到你的本地硬盘 xff0c 或者在两个FTP站点之间传输文件 xff0c 即站点到站点传输 xff0c 而无须经过自己的计算机 听起来是不是
  • Qt 模态窗口和非模态窗口

    项目中要用到非模态窗口 xff0c 程序一开始弹出一个主窗口来 xff0c 点击一个按钮的时候弹出一个非模态窗口 xff0c 虽然是一个比较简单的需求 xff0c 但是在实现的过程中有各种问题 列一下自己遇到的问题并且说一下自己的解决方法
  • qt中使用重写控件的方法

    在 cpp文件里的构造函数里F2类名进入到ui h文件手动改自定义控件指针及实例 xff0c 切记如果重新生成项目方案提示更新ui h文件时选择不更新此文件否则手动改完的会自动变回去
  • Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

    重要 xff1a GUI线程和辅助线程 如前所述 xff0c 每个程序在启动时都有一个线程 这个线程被称为 主线程 在Qt应用程序中也称为 GUI线程 Qt GUI必须在这个线程中运行 所有小部件和几个相关类 例如QPixmap 都不能在辅
  • qt 子线程(多线程)更新gui的几种方法

    直接进入主题 xff0c 据我所知 xff0c 方法有3种 xff1a 1 自定义signal slot xff0c 这个就不多说了 xff0c 标准方法 2 使用QmetaMethod invoke xff0c 这是可以直接在子线程调用的
  • QT-多线程重要概念及与界面之间交互总结(混淆点分析:c#中可以在子线程中创建ui控件,qt中不能在子线程中创建ui控件)

    1 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之类的界面组件 xff08 c 中可以在子线程中创建ui控件 xff09 因为在QT中 所有界面组件相关的操作都必须在主线程中 也就是GUI thread 所
  • Qt-事件过滤器eventFilter概念及使用方法实例

    一 事件的流向 QT的各种控件 xff08 QObject的子类 xff09 都有事件处理成员函数 xff0c 例如 xff1a bool QObject event QEvent e 所有事件 dragEnterEvent QDragEn

随机推荐