闲来无事,总结一下这四种QJson类型,包括QJsonObject、QJsonArray、QJsonValue、QJsonDocument,重点是记录一下这四种类型之间及与QString的相互转换,免得每次用到都要再搜一遍。
1. QJson类型介绍
Qt 提供了用于处理 JSON 数据的四种主要类型:
-
QJsonObject:表示一个 JSON 对象,JSON对象类似于键值对的字典,其有着指定的格式要求。
JSON格式数据示例:
{ "姓名": "小美", "年龄": 25, "性别": 女, "工作": ["律师", "漫画家"], "配偶": { "姓名": "小明", "年龄": 26, "性别": 男, "工作": ["程序员", "小说家"] } }
-
QJsonArray:表示一个 JSON 数组,以数组形式存储QJsonValue对象,是一个有序列表,有着如同其他数组一样的方法操作元素。
不仅存储QJsonObject对象,QJsonValue的各种类型都可以存储。
-
QJsonValue:表示一个通用 JSON 值,可以是JSON中的字符串、数字、布尔值、对象、数组或 null。QJsonObject的值都是QJsonValue类型的。
QJsonValue类型 对应数据类型 QJsonValue::Bool bool QJsonValue::Double double QJsonValue::String QString QJsonValue::Array QJsonArray QJsonValue::Object QJsonObject QJsonValue::Null NULL Qt提供了方法判断其类型以及转换方法,示例:
QJsonValue value; if(value.isBool()){ // 使用is*()方法判断 bool v = value.toBool(); // 使用to*()方法转换 // ... }else if(value.isDouble()){ double v = value.toDouble(); // ... }else if(value.isString()){ QString v = value.toString(); // ... }else if(value.isArray()){ QJsonArray array = value.toArray(); // ... }else{ // ... }
-
QJsonDocument:用于表示 JSON 文档,是 QJsonObject 和 QJsonArray 的包装类型,便于序列化和解析,也可以作为各QJson数据类型转换的中间数据类型。
Qt也提供了方法判断其类型以及转换方法,方法与QJsonValue有些不同,且只使用于QJsonObject和QJsonArray,示例:
QJsonDocument doc; if(doc.isObject()){ // 使用is*()方法判断 QJsonObject obj = doc.object(); // 使用*()方法转换,与QJsonValue不同 // ... }else if(doc.isArray()){ QJsonArray arr = value.array(); // ... }
2. 各 QJson 类型之间的转换
2.1 QJsonObject 转换至其他类型
-
QJsonObject → QJsonArray:
QJsonObject对象一般不能直接转为QJsonArray对象,就如同变量不会直接转为数组一样。要么将QJsonObject对象以一个元素的形式存入QJsonArray;要么将QJsonObject中某一个array格式的QJsonValue对象转为QJsonArray。
QJsonObject obj; /// 1 QJsonArray arr1{obj}; /// 2 QJsonArray arr2; arr2.append(obj); /// 3 QJsonArray arr3 = obj["工作"].toArray();
-
QJsonObject → QJsonValue:
QJsonObject是QJsonValue的类型之一,可以直接使用QJsonValue的构造函数转换。
当然,因为QJsonObject的值都是QJsonValue类型的,所以一般使用情况都是取QJsonObject对象的值。
QJsonObject obj; /// 1 QJsonValue value1(obj); /// 2 QJsonValue value2 = QJsonValue(obj);
-
QJsonObject → QJsonDocument:
直接使用QJsonDocument的构造函数转换即可,注意其
QJsonDocument::fromJson()
方法不是针对QJsonObject的,是对于字节流的。QJsonObject obj; /// 1 QJsonDocument doc1(obj); /// 2 QJsonDocument doc2 = QJsonDocument(obj);
2.2 QJsonArray 转换至其他类型
-
QJsonArray → QJsonObject:
QJsonArray对象一般不能直接转换为QJsonObject对象,要么取QJsonArray中的一个元素,要么以值的方式赋给QJsonObject对象的一个自定义key。
QJsonArray arr; /// 1 QJsonObject obj1 = arr[1]; /// 2 QJsonObject obj2["arr"] = arr;
-
QJsonArray → QJsonValue:
QJsonArray是QJsonValue的类型之一,可以直接使用QJsonValue的构造函数转换。
当然,因为QJsonArray的元素都是QJsonValue类型的,所以一般使用情况都是取QJsonArray中的某一个元素。
QJsonArray array; /// 1 QJsonValue value1(array); /// 2 QJsonValue value2 = QJsonValue(array);
-
QJsonArray → QJsonDocument:
直接使用QJsonDocument的构造函数隐式转换即可。
QJsonArray array; /// 1 QJsonDocument doc1(array); /// 2 QJsonDocument doc2 = QJsonDocument(array);
2.3 QJsonValue 转换至其他类型
-
QJsonValue → QJsonObject:
使用QJsonValue封装的方法即可,使用前一般会判断一下。
QJsonValue value; if(value.isObject()){ QJsonObject obj = value.toObject(); }
-
QJsonValue → QJsonArray:
使用QJsonValue封装的方法即可,使用前一般会判断一下。
QJsonValue value; if(value.isArray()){ QJsonArray array = value.toArray(); }
-
QJsonValue → QJsonDocument:
一般都是先转换为其他显式类型,再转换为QJsonDocument。
QJsonValue value; if(value.isObject()){ /// 1 QJsonDocument doc1(value.toObject()); /// 2 QJsonDocument doc2 = QJsonDocument(value.toObject()); }else if(value.isArray()){ /// 1 QJsonDocument doc1(value.toArray()); /// 2 QJsonDocument doc2 = QJsonDocument(value.toArray()); }
-
转为基本类型(如字符串、数字、布尔值):
使用QJsonValue封装的方法即可,使用前一般会判断一下。
QJsonValue value; if(value.isString()){ QString str = value.toString(); } if(value.isDouble()){ double num = value.toDouble(); } if(value.isBool()){ bool b = value.toBool(); }
2.4 QJsonDocument 转换至其他类型
-
QJsonDocument → QJsonObject:
使用QJsonDocument封装的方法即可,使用前一般会判断一下。
QJsonDocument doc; if(doc.isObject()){ QJsonObject obj = doc.object(); }
-
QJsonDocument → QJsonArray:
使用QJsonDocument封装的方法即可,使用前一般会判断一下。
QJsonDocument doc; if(doc.isArray()){ QJsonArray arr = doc.array(); }
-
QJsonDocument → QJsonValue:
一般都是先转换为其他类型,再转换为QJsonValue。
QJsonDocument doc; if(doc.isObject()){ QJsonValue value(doc.object()); }else if(doc.isArray()){ QJsonValue value(doc.array()); }
3. 各 QJson 类型与 QString 的转换
3.1 各 QJson 类型序列化至 QString
-
QJsonObject → QString:
必须通过QJsonDocument中转,QJsonDococunment有
toJson()
方法将其序列化,然后再使用QString的方法转换为QString即可。QJsonObject obj; QJsonDocument doc(obj); QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
-
QJsonArray → QString:
必须通过QJsonDocument中转,QJsonDococunment有
toJson()
方法将其序列化,然后再使用QString的方法转换为QString即可。QJsonArray array; QJsonDocument doc(array); QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
-
QJsonValue → QString:
需先转为对应的其他类型再使用上述方法序列化。
QJsonValue value; if(value.isObject()){ QJsonDocument doc(value.toObject()); QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); }else if(value.isArray()){ QJsonDocument doc(value.toArray()); QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); }
-
QJsonDocument → QString:
QJsonDococunment有
toJson()
方法将其序列化,然后再使用QString的方法转换为QString即可。参数最好指定
QJsonDocument::Compact
,用来压缩格式,使其成为紧凑格式,去掉字符串中系统自动添加的空格、换行符、缩减,对于多行输入的字符串能很好的规范格式。默认参数是QJsonDocument::Indented
,被称为格式化(或美化)格式,不会做变动。QJsonDocument doc; QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
注:如果需要转换为
std::string
类型,在toJson()
序列化后,直接使用toStdString()
方法即可QJsonDocument doc; std::string jsonStr = doc.toJson(QJsonDocument::Compact).toStdString();
3.2 QString 解序列化至各 QJson 类型
-
QString → QJsonObject:
必须通过QJsonDocument中转,使用
QJsonDocument::fromJson()
方法先转为QJsonDocument,再转为QJsonObject。字符串必须完全符合JSON格式,不然会转换失败。
QString jsonStr = "..."; QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8()); if(doc.isObject()){ QJsonObject obj = doc.object(); }
-
QString → QJsonArray:
必须通过QJsonDocument中转,使用
QJsonDocument::fromJson()
方法先转为QJsonDocument,再转为QJsonArray。QString jsonStr = "..."; QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8()); if(doc.isArray()){ QJsonArray array = doc.array(); }
-
QString → QJsonValue:
要么先转为QJsonObject格式或QJsonArray格式,再转为QJsonValue;要么直接以赋值的形式,通过构造函数传入。
QString jsonStr = "..."; /// 1 QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8()); if(doc.isObject()){ QJsonValue value(doc.object()); }else if(doc.isArray()){ QJsonValue value(doc.array()); } /// 2 QJsonValue value(jsonStr);
-
QString → QJsonDocument:
使用
QJsonDocument::fromJson()
方法转换即可。QString jsonStr = "..."; QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());