【QT】——QJson类的使用

目录

1.Json的格式

1.1.Json数组

1.2.Json对象

2.QJson

2.1 QJsonObject

2.2 QJsonValue

2.3 QJsonArray

2.4 QJsonDocument

3.示例

3.1 写操作

3.2 读操作


1.Json的格式

Json的基本概念

Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json,Json一般处理两种任务:

  • 组织数据(数据序列化),用于数据的网络传输
  • 组织数据(数据序列化),写磁盘文件实现数据的持久化存储(一般以.json 作为文件后缀)

Json中主要两种数据格式:Json数组,和Json 对象

1.1.Json数组

  • Json 数组使用 [] 表示,[] 里边是元素,元素和元素之间使用逗号间隔,最后一个元素后边没有逗号。
  • Json支持多种数据类型,包括:整形、 浮点型、 字符串、 布尔类型、 json数组、 json对象、 空值-null。
  • Json数组中的数据可以一致,也可以不一致
//数据一致
// 整形
[1,2,3,4,5]
// 字符串
["lisi", "haha", "xxx", "nihao", "robin"]

//数据不一致:
["lisi", 1, null, 1.1, "robin"]


//Json数组嵌套使用,Json数组中可以有Json数组
[
   ["lisi", 1, null, 1.1, "robin"],
   [1,2,3,4,5],
   ["lisi", "haha", "xxx", "nihao", "robin"],
   "lisa"
]

1.2.Json对象

  • Json 对象使用 {} 来描述,每个 Json 对象中可以存储若干个元素,每一个元素对应一个键值(key:value 结构) 。
  • 键值(key)必须是字符串,位于同一层级的键值不能重复(因为是通过键值取出对应的 value 值)
  • value 值的类型是可选的,可根据实际需求指定,可用类型包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null

{
    "Name":"lisa",
     "Age":20,
    
    //Family中的value值是一个Json对象
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}


错误案例:

// test.json
{
    "name":"lisa",
    "age":19
}
{
    "user":"lisi",
    "passwd":"123456"
}

在一个 Json 文件中只能有一个 Json 数组或者 Json 对象的根节点,不允许同时存储多个并列的根节点

2.QJson

  1. QJsonDocument:它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档
  2. QJsonArray:QJsonArray是QT中的JSON 数组的类型。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
  3. QJsonObject :QJsonObject是是QT中的Json对象类型,其中键是唯一的字符串,值由 QJsonValue 表示。
  4. QJsonValue:该类封装了 JSON 支持数据类型,是key-value中的 value类型。

2.1 QJsonObject

QJsonObject 封装了 Json 中的对象,在里边可以存储多个键值对.

下面是常用的接口函数:

//构造函数
QJsonObject::QJsonObject();	// 构造空对象

//将键值对插入到json对象中
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);

//删除键值对,通过key值进行删除
void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key);	// 返回key对应的value值

//插值键值对
iterator QJsonObject::find(const QString &key); //返回其迭代器
bool QJsonObject::contains(const QString &key) const;//判断是否存在



//获取键值对的 对数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;

//通过key值获取value
QJsonValue QJsonObject::value(const QString &key) const;    // utf8
QJsonValue QJsonObject::value(QLatin1String key) const;	    // 字符串不支持中文
QJsonValue QJsonObject::operator[](const QString &key) const;
QJsonValue QJsonObject::operator[](QLatin1String key) const;

//查找
iterator QJsonObject::find(const QString &key);
bool QJsonObject::contains(const QString &key) const;

遍历方式 

//获取Json对象中所有的 key值,返回到QStringList中。
QStringList QJsonObject::keys() const;

QStringList通过函数at取下标获取到各个QJsonObject每个对象的key值。

示例:
//假设object对象中有很多个键值对,然后我们需要将每个键值对给取出来
QJsonObject object;
QStringList stringlist=object.keys();

for(int i=0;i<object.size();i++)
{
  //第i个键值对
   QString key=stringlist.at(i);
   QJsonValue value=object[key];
}

2.2 QJsonValue

在 Qt 中 QJsonValue 可以封装的基础数据类型有六种(和 Json 支持的类型一致),分别为:

  • 布尔类型:QJsonValue::Bool
  • 浮点类型(包括整形): QJsonValue::Double
  • 字符串类型: QJsonValue::String
  • Json 数组类型: QJsonValue::Array
  • Json 对象类型:QJsonValue::Object
  • 空值类型: QJsonValue::Null

这些类型可以通过 QJsonValue 的构造函数被封装为一个类对象:

构造函数:
// Json对象
QJsonValue(const QJsonObject &o);
// Json数组
QJsonValue(const QJsonArray &a);
// 字符串
QJsonValue(const char *s);
QJsonValue(QLatin1String s);
QJsonValue(const QString &s);
// 整形 and 浮点型
QJsonValue(qint64 v);
QJsonValue(int v);
QJsonValue(double v);
// 布尔类型
QJsonValue(bool b);
// 空值类型
QJsonValue(QJsonValue::Type type = Null);

//判断类型
// 是否是Json数组
bool isArray() const;
// 是否是Json对象
bool isObject() const;
// 是否是布尔类型
bool isBool() const;
// 是否是浮点类型(整形也是通过该函数判断)
bool isDouble() const;
// 是否是空值类型
bool isNull() const;
// 是否是字符串类型
bool isString() const;
// 是否是未定义类型(无法识别的类型)
bool isUndefined() const;


// 转换为Json数组
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;
// 转换为布尔类型
bool toBool(bool defaultValue = false) const;
// 转换为浮点类型
double toDouble(double defaultValue = 0) const;
// 转换为整形
int toInt(int defaultValue = 0) const;
// 转换为Json对象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;
// 转换为字符串类型
QString toString() const;
QString toString(const QString &defaultValue) const;

2.3 QJsonArray

QJsonArray 封装了 Json 中的数组,在里边可以存储多个元素,

QJsonArray中的所有类型的操作,都需要统一为 QJsonValue 类型。因为 QJsonValue 类型封装了各个数据类型。比如:

  • 如果QString类型对象想要插入到QJsonArray中,就需要将QString类型对象转换为QJsonValue类型,才插入到QJsonArray中。
  • 同样,从QJsonArray中获取的QString对象都是QJsonValue,通过isString判断其对象,在使用toString转换成QString对象。其他类型也是采取这种方法。

常用接口

QJsonArray::QJsonArray();

//添加元素
void QJsonArray::append(const QJsonValue &value);	// 在尾部追加
void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前
iterator QJsonArray::insert(iterator before, const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部
void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
void QJsonArray::push_front(const QJsonValue &value); // 添加到头部

//删除元素
iterator QJsonArray::erase(iterator it);    // 基于迭代器删除
void QJsonArray::pop_back();           // 删除尾部
void QJsonArray::pop_front();          // 删除头部
void QJsonArray::removeAt(int i);      // 删除i位置的元素
void QJsonArray::removeFirst();        // 删除头部
void QJsonArray::removeLast();         // 删除尾部
QJsonValue QJsonArray::takeAt(int i);  // 删除i位置的原始, 并返回删除的元素的值


//获取数组中的个数
int QJsonArray::count() const;
int QJsonArray::size() const;


//获取最后一个元素
QJsonValue QJsonArray::at(int i) const;
QJsonValue QJsonArray::first() const; // 头部元素
QJsonValue QJsonArray::last() const; // 尾部元素
QJsonValueRef QJsonArray::operator[](int i);

2.4 QJsonDocument

在QT中,从文件中或从网络中读取的数据是 QJson的字符流,这种字符流则用QJsonDocument来表示。

一张图表示QJsonDocument与QJsonObject 对象/QJsonArray对象的关系:

  •  文件或者网络中进行传输的数据都是 字符流,如果是Json格式的字符流,则称为Json格式的字符流.
  • 所以我们将封装好的QJsonObject 对象或者QJsonArray对象的数据 在与 文件/网络 传输之前,都需要将转换QJsonDocument对象,QJsonDocument对象在转换为QJson字符流进行传输。

常用的接口:

//将QJsonObject对象转换为QJsonDocument
QJsonDocument::QJsonDocument(const QJsonObject &object);
//将QJsonArray对象转换为QJsonDocument
QJsonDocument::QJsonDocument(const QJsonArray &array);

//将文件对象中的数据进行序列化
// 二进制格式的json字符串
QByteArray QJsonDocument::toBinaryData() const;	 
// 文本格式
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;	

//从网络或者文件中读取到字符串
//将字符串转换为QJsonDocumment类型
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
// 参数文件格式的json字符串
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);


// 判断文档对象中存储的数据是不是Json数组
bool QJsonDocument::isArray() const;
// 判断文档对象中存储的数据是不是json对象
bool QJsonDocument::isObject() const
    
// 文档对象中的数据转换为json对象
QJsonObject QJsonDocument::object() const;
// 文档对象中的数据转换为json数组
QJsonArray QJsonDocument::array() const;

3.示例

3.1 写操作

将如下的Json字符串写入到文件中:

  1. 创建一个QJsonOBject对象,将各个键值对设置进QJsonOBject对象中
  2. 将QJsonOBject对象转换为QJsonDocument对象
  3. QJsonDocument对象在转换为QByteArry对象中。
  4. 通过文件操作写入到文件中
/*
{
    "Name":"lisa",
     "Age":20,

    //Family中的value值是一个Json对象
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}
*/


void qjson_write()
{
    QJsonObject value;
    value.insert("Name","lisa");
    value.insert("age",20);

    /*
      封装:
      "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
       }
   */
    QJsonObject family_value;
    family_value.insert("Father","Gol·D·Roger");
    family_value.insert("Mother","Portgas·D·Rouge");
    QJsonArray bro_arry;
    bro_arry.push_back(QJsonValue("Sabo"));
    bro_arry.push_back(QJsonValue("Monkey D. Luffy"));
    family_value.insert("Brother",bro_arry);

    value.insert("Family",family_value);
    value.insert("IsAlive",false);
    value.insert("Comment","yyds");

    QJsonDocument document(value);
    QByteArray s=document.toJson();

    QFile file("E:\\test1.json");

    file.open(QFile::WriteOnly);
    file.write(s);
    file.close();
}

输出:

toBinaryData()函数转化的效果;

 toJson()函数转换的效果:

3.2 读操作

  • 将上面的文件给读取到QJsonDocument,并转换为QJsonObject.
  • 将其中键值为 age,Name 和 Comment的进行打印。
void qjson_read()
{
    //打开文件,并读取Json字符串
    QFile file("E:\\test1.json");
    file.open(QFile::ReadOnly);
    QByteArray s=file.readAll();
    file.close();

    //将Json字符串转换为QJsonDocument对象
    QJsonDocument document=QJsonDocument::fromJson(s);

    QJsonObject object;
    if(document.isObject()){
         object=document.object();
    }

    //获取所有的key值
    QStringList keys=object.keys();
   // qDebug()<<object.size();
   //遍历QJsonObject中所有的键值对
    for(int i=0;i<object.size();i++)
    {
        QString key=keys.at(i);
        QJsonValue value=object[key];

        if(value.isDouble())
        {
            int v=value.toInt();
            qDebug()<<key<<v;
        }
        else if(value.isString())
        {
            QString s=value.toString();
            qDebug()<<key<<s;
        }
    }

}

输出: 

  • 11
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值