Qt中的JSON操作

JSON(JavaScript Object Notation,js对象标记)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。关于JSON的更多解释,请参看JSON官网

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

QJsonValue

QJsonValue类封装了一个json格式中的值。该值可以是如下6中基本类型:

 

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

一个QJsonValue可以表示上面任何一种数据类型。此外,QJsonValue还有一个特殊的标志用来表示未定义的值。可以使用isUndefined()函数来进行判断。而一个QJsonValue中存储的类型可以通过type()或isBool(),isString()之类的函数进行查询。同样,QJsonValue中存储的值可以通过toBool(),toString()等函数转换到具体的类型。

QJsonValue中存储的值在内部是强类型的,并且和QVariant相反,它不会尝试进行任何的隐式类型转换。这意味着将QJsonValue转换成一个不是它存储的类型,将返回一个该类型的模型构造函数返回的值。

其实,说到QJsonValue,还有另一个类要说,QJsonValueRef,该类是一个对于QJsonArray和QJsonObject来说的一个帮助类。当你获得一个QJsonValueRef类的对象后,你可以把它当做一个QJsonValue对象的应用来使用。如果你向他赋值,该值会实际作用到底层的QJsonArray或者QJsonObject对象中的元素上。而要想使用该类,可以使用一下的两个方法:

  • QJsonArray::operator[](int i)
  • QJsonObject::operator[](const QString& key)const;

下面来看一下QJsonValue的构造函数:

 
  1. QJsonValue(Type type = Null)

  2. QJsonValue(bool b)

  3. QJsonValue(double n)

  4. QJsonValue(int n)

  5. QJsonValue(qint64 n)

  6. QJsonValue(const QString &s)

  7. QJsonValue(QLatin1String s)

  8. QJsonValue(const char *s)

  9. QJsonValue(const QJsonArray &a)

  10. QJsonValue(const QJsonObject &o)

  11. QJsonValue(const QJsonValue &other)

可以看到,该类主要是对基本类型的一个包装。

 

QJsonObject

QJsonObject类封装了一个json对象。一个json对象是一个键值对的列表,其中key是唯一的字符串,而值就是一个我们上面讲到的QJsonValue。一个QJsonObject的对象可以转换到QVariantMap,要可以由QVariantMap转换得到。

我们可以使用size()函数来查询一个QJsonObject中存储的键值对的个数;使用insert()和remove()来插入或从中删除键值对;还可以使用标准的C++迭代器来遍历它。

QJsonObject类是一个隐式共享类。

其构造函数如下:

 
  1. QJsonObject()

  2. QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)

  3. QJsonObject(const QJsonObject &other)

我们可以使用初始化列表来快速的构建一个QJsonObject对象。如下:

 
  1. QJsonObject object

  2. {

  3. {"property1", 1},

  4. {"property2", 2}

  5. };

如此之外,比较常用的就是insert()函数了:

iterator QJsonObject::insert(const QString &key, const QJsonValue &value)

一般,我们可以先定义一个空的QJsonObject对象,然后使用该函数向其中插入需要的键值对。如果新插入的key已存在,那么会进行替换。

下面,我们通过一个例子还使用该类构造如下json字符串:{"name":"lily", "age":23, "addr":{"city":"xxx", "province":"yyy"}}

代码如下:

 
  1. #include <QCoreApplication>

  2. #include <QDebug>

  3. #include <QJsonObject>

  4.  
  5. int main(int argc, char *argv[])

  6. {

  7. QCoreApplication a(argc, argv);

  8.  
  9. QJsonObject obj;

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

  11. obj.insert("age", 23);

  12. QJsonObject addr;

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

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

  15. obj.insert("addr", addr);

  16. qDebug() << obj;

  17.  
  18. return a.exec();

  19. }

我们先构建了一个QJsonObject对象obj,然后向其中插入姓名和年龄键值对;因为地址又是一个QJsonObject,所以我们又构建了addr对象,向其中插入城市和省份,最后,将该QJsonObject做为地址键值对的值,插入到obj中。打印结果如下:


 

QJsonArray

顾名思义,QJsonArray封装了一个JSON数组。一个JSON数组是一个值的列表。我们可以向这个列表中插入或删除QJsonValue。

同时,我们可以把一个QVariantList转换成一个QJsonArray。也可以使用标准C++迭代器对它进行遍历。

其构造函数如下:

 
  1. QJsonArray()

  2. QJsonArray(std::initializer_list<QJsonValue> args)

  3. QJsonArray(const QJsonArray &other)

我们也可以像上面那样,使用一个初始化列表来构建一个QJsonArray对象:

QJsonArray array = { 1, 2.2, QString() };

在此我们只使用了单个的值,没有使用键值对。其实,这样的json对象,一般我们就称为数组。

和QJsonObject一样,我们一般也是通过它的insert()函数来生成我们需要的json数组:

 
  1. void insert(int i, const QJsonValue &value)

  2. iterator insert(iterator before, const QJsonValue &value)

  3.  

下面,我们继续上面的例子,来生成一个表示人物信息的列表。代码如下:

 
  1. #include <QCoreApplication>

  2. #include <QDebug>

  3. #include <QJsonObject>

  4. #include <QJsonArray>

  5.  
  6. int main(int argc, char *argv[])

  7. {

  8. QCoreApplication a(argc, argv);

  9.  
  10. QJsonObject obj1;

  11. obj1.insert("name", "lily");

  12. obj1.insert("age", 23);

  13. QJsonObject addr1;

  14. addr1.insert("city", "guangzhou");

  15. addr1.insert("province", "guangdong");

  16. obj1.insert("addr", addr1);

  17. qDebug() << obj1;

  18.  
  19. QJsonObject obj2;

  20. obj2.insert("name", "tom");

  21. obj2.insert("age", 24);

  22. QJsonObject addr2;

  23. addr2.insert("city", "shenzhen");

  24. addr2.insert("province", "guangdong");

  25. obj2.insert("addr", addr2);

  26. qDebug() << obj2;

  27.  
  28. QJsonObject obj3;

  29. obj3.insert("name", "jerry");

  30. obj3.insert("age", 24);

  31. QJsonObject addr3;

  32. addr3.insert("city", "foshan");

  33. addr3.insert("province", "guangdong");

  34. obj3.insert("addr", addr3);

  35. qDebug() << obj3;

  36.  
  37. QJsonArray array;

  38. array.push_back(obj1);

  39. array.push_back(obj2);

  40. array.push_back(obj3);

  41. qDebug() << array;

  42.  
  43. return a.exec();

  44. }


在此,我们只是简单的构建了三个人物的QJsonObject对象,然后将它们放入一个QJsonArray中。输入结果如下:


QJsonDocument

QJsonDocument类提供了读写JSON文档的方法。QJsonDocument类包装了一个完整的JSON 文档,我们可以以utf-8编码的文本格式和Qt自己的二进制格式来操作该文档。一个JSON文档可以使用QJsonDocument::fromJson()函数转换json文本字符串来得到。而toJson()可以将其转换成文本。这个解析器是非常快速和高效的,Qt也是使用它来将JSON对象转换成其二进制表示的。解析得到的文档可以使用isNull()来判断是否有效。还可以使用isArray()和isObject()函数来判断该文档所包含的是否是数据或json对象。如果是,可以使用array()或object()函数还获得其中的对象或数组。

其构造函数如下:

 
  1. QJsonDocument()

  2. QJsonDocument(const QJsonObject &object)

  3. QJsonDocument(const QJsonArray &array)

  4. QJsonDocument(const QJsonDocument &other)

 

除了构造函数外,该类还提供了两个转换函数,可以将json文档序列化为二进制对象,然后我们就可以将该对象存储到文件中,或发送到网络上。

 
  1. QByteArray toBinaryData() const

  2. QByteArray toJson(JsonFormat format = Indented) const

  3.  

 

下面,我们就使用该类将我们上面生成的json数组写入到文件中:

代码如下:

 
  1. #include <QCoreApplication>

  2. #include <QDebug>

  3. #include <QJsonObject>

  4. #include <QJsonArray>

  5. #include <QFile>

  6. #include <QJsonDocument>

  7.  
  8. int main(int argc, char *argv[])

  9. {

  10. QCoreApplication a(argc, argv);

  11.  
  12. QJsonObject obj1;

  13. obj1.insert("name", "lily");

  14. obj1.insert("age", 23);

  15. QJsonObject addr1;

  16. addr1.insert("city", "guangzhou");

  17. addr1.insert("province", "guangdong");

  18. obj1.insert("addr", addr1);

  19. qDebug() << obj1;

  20.  
  21. QJsonObject obj2;

  22. obj2.insert("name", "tom");

  23. obj2.insert("age", 24);

  24. QJsonObject addr2;

  25. addr2.insert("city", "shenzhen");

  26. addr2.insert("province", "guangdong");

  27. obj2.insert("addr", addr2);

  28. qDebug() << obj2;

  29.  
  30. QJsonObject obj3;

  31. obj3.insert("name", "jerry");

  32. obj3.insert("age", 24);

  33. QJsonObject addr3;

  34. addr3.insert("city", "foshan");

  35. addr3.insert("province", "guangdong");

  36. obj3.insert("addr", addr3);

  37. qDebug() << obj3;

  38.  
  39. QJsonArray array;

  40. array.push_back(obj1);

  41. array.push_back(obj2);

  42. array.push_back(obj3);

  43. qDebug() << array;

  44.  
  45. QJsonDocument jsonDoc(array);

  46. QByteArray ba = jsonDoc.toJson();

  47. QFile file("result.json");

  48. if(!file.open(QIODevice::WriteOnly))

  49. {

  50. qDebug() << "write json file failed";

  51. return 0;

  52. }

  53. file.write(ba);

  54. file.close();

  55.  
  56. return a.exec();

  57. }

我们先使用QJsonArray构建出一个QJsonDocument对象,然后调用其toJson()方法,将该json文档转换成一个字节数组。注意,toJson()函数会接受一个格式化参数:

QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const

其中,format主要有两种格式,一种是人们可读的格式,一种是紧凑的格式。分别描述如下表:

ConstantValueDescription
QJsonDocument::Indented0定义人们可读的输出格式,如下:
{
"Array":[
true,
999,
"string"
],
"key": "value",
"null": null
}
QJsonDocument::Compact1定义一个紧凑的输出格式,如下:
{"Array": [true, 999, "string"], "key": "value", "null":null}


toJson()函数默认使用Indented,一缩进的形式生成人们可读的json文件。

运行该程序后,在编译目录查看生成的json文件。结果如下:

 

当然,除了将json对象写入到文件中,QJsonDocument还提供了几个静态函数,将从文件中读取出的原始数据或json字符串转换成一个QJsonDocument对象。函数声明信息如下:

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

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

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

  4. QJsonDocument fromVariant(const QVariant &variant)

  5.  

 

下面,我们就使用这些函数,将我们写入到文件中的json对象再读出来,并生成一个QJsonDocument对象。

代码如下:

 
  1. #include <QCoreApplication>

  2. #include <QDebug>

  3. #include <QFile>

  4. #include <QJsonDocument>

  5.  
  6. int main(int argc, char *argv[])

  7. {

  8. QCoreApplication a(argc, argv);

  9.  
  10. QFile file("result.json");

  11. if(!file.open(QIODevice::ReadOnly))

  12. {

  13. qDebug() << "read json file failed";

  14. return 0;

  15. }

  16. QByteArray ba = file.readAll();

  17. qDebug() << "读出的数据如下:";

  18. qDebug() << ba;

  19. QJsonParseError e;

  20. QJsonDocument jsonDoc = QJsonDocument::fromJson(ba, &e);

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

  22. {

  23. qDebug() << jsonDoc;

  24. }

  25.  
  26. return a.exec();

  27. }


在此,因为我们从文件中读出的是一个json形式的字符串,所以可以使用fromJson()函数,将其转换成一个QJsonDocument对象。同时,在调用fromJson()函数时,我们还为它传入了一个QJsonParseError对象,用来接收解析json字符串的过程中,有可能发生的错误信息。

代码运行如下:

--------------------- 本文来自 求道玉 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/amnes1a/article/details/68957112?utm_source=copy

  • 17
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt,可以使用Qt提供的Json类来组织和解析数据。Qt从版本5.0开始提供了对Json的支持。主要有四个与Json相关的类常用:QJsonDocument、QJsonArray、QJsonObject和QJsonValue。 QJsonDocument类封装了一个完整的JSON文档,可以从基于文本的UTF-8编码的表示以及Qt的二进制格式读取和写入该文档。 QJsonArray表示JSON数组,是一个值的列表。可以通过插入和删除QJsonValue来操作该列表。 QJsonObject表示JSON对象,是键值对的列表,其键是唯一的字符串,值由QJsonValue表示。 QJsonValue类封装了JSON支持的数据类型。 QJsonParseError类用于报告JSON解析过程的错误。 对于Json的使用,可以参考以上提到的类的文档和相关函数进行操作,根据具体的需求进行数据的组织和解析。Json格式的数据在Qt可以方便地进行处理,并且由于Json的数据格式与语言无关,因此在QtJson使用具有广泛的应用场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【QTQt Json操作](https://blog.csdn.net/qq_43331089/article/details/124582761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Qt专栏】QtJson的使用教程](https://blog.csdn.net/weixin_43729127/article/details/127522889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值