QJsonDocument类提供了一种读写JSON文档的方法。QJsonDocument是一个包装完整JSON文档的类,可以从基于UTF-8编码的文本表示和Qt自己的二进制格式读写该文档。所谓的JSON文档指的是就是一个我们能看到的用JSON语法构成的文档。比如下面的文本几种形式
{
"id": 28849,
"code": 49497,
"message": "Magnam beatae dolores voluptatem. "
}
[
"http://dummyimage.com/190x428.png/595f0e/5a6b24",
"http://dummyimage.com/477x397.png/2a6041/451d77",
"http://dummyimage.com/209x243.png/557f66/2b597b",
"http://dummyimage.com/411x476.png/7d545b/6c615e"
]
[
{
"userName": "Julio Hoeger",
"uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"
},
"我是普通文本~",
{
"userName": "Julio Hoeger",
"uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"
},
"我是普通文本~",
{
"userName": "Julio Hoeger",
"uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"
},
"我是普通文本~",
{
"userName": "Julio Hoeger",
"uid": "9520e843-4548-4dfa-a2a4-f3ac3c14cce8"
},
"我是普通文本~"
]
{
"total": 200,
"data": [
{
"avatar": "http://dummyimage.com/498x200.png/6e4a6b/247832",
"logo": "http://dummyimage.com/100x200.png/0a257b/2a1f0c",
"email": "Mitchell.Rowe51@gmail.com",
"userName": "Bradford Prosacco",
"createAt": 1438303106566,
"birthday": "06/01/2018 05:15",
"age": 11055,
"price": 91378.31,
"homePage": "https://skylar-utools.info",
"phoneNumber": "15096075236",
"city": "Fayetteville 6498 Alexandrea Shoals",
"workAt": "Altenwerth - Stracke",
"uid": "37c07e07-4713-46e1-881f-3217bb362209",
"description": "Eveniet quia quam eos non. Dolorem consectetur neque beatae cumque. Voluptatibus possimus placeat illo in eligendi et. Vel corrupti ipsum et voluptatum eum ullam molestiae maiores. Est a rerum sint et vitae et expedita. Sed minus quia quo minima. Exercitationem laboriosam corrupti id. Sed magni itaque laboriosam. Dicta eum nisi sit. Ad in accusantium quisquam praesentium. Error iste sed.",
"idNo": "372337200906168349",
"socialCode": "U43208743DQUE95M69"
},
{
"avatar": "http://dummyimage.com/444x260.png/777366/581a70",
"logo": "http://dummyimage.com/100x200.png/5d343a/772c02",
"email": "Edd.Nolan@gmail.com",
"userName": "Arnold Gaylord",
"createAt": 1189591090933,
"birthday": "06/13/2019 00:49",
"age": 6715,
"price": 67365.55,
"homePage": "http://lottie-utools.info",
"phoneNumber": "19610566837",
"city": "East Heath 22339 Stokes Summit",
"workAt": "Feil LLC",
"uid": "33039d4d-a1a4-4c95-a993-ef0d7b059a9a",
"description": "Unde facilis qui sapiente rem nemo consequatur beatae consequatur sed. Qui veritatis non ipsam qui consequuntur suscipit deleniti. Iusto doloribus quidem quas ea ut modi eos qui sit. Quisquam sunt neque iure qui quasi aut fugit atque ut. Ratione officia qui qui consequatur corporis esse et. Sit omnis est occaecati. Aliquam quidem soluta quia et cum cumque rerum et qui. Dolores ratione est aspernatur voluptates. Rem sunt culpa omnis voluptas deserunt non alias et quibusdam. Eveniet porro magni laborum. Consequatur fugiat illum voluptatem eos beatae quia exercitationem hic omnis. Omnis cupiditate at aliquam ut quo. Et ducimus aperiam.",
"idNo": "911779201611114210",
"socialCode": "M4731779YDWPKTK49Q"
},
{
"avatar": "http://dummyimage.com/189x114.png/085e64/417806",
"logo": "http://dummyimage.com/100x200.png/6c7c00/565c4d",
"email": "Cecelia.Sauer96@hotmail.com",
"userName": "Theodore Price",
"createAt": 1355674989157,
"birthday": "07/26/2015 20:02",
"age": 39166,
"price": 78955.78,
"homePage": "http://jay-utools.net",
"phoneNumber": "15615929019",
"city": "New Gayle 598 Kaycee Brooks",
"workAt": "Prohaska - Ratke",
"uid": "8128feca-d4f0-454d-8816-f7bfa97d73b4",
"description": "Maxime aut in laudantium aspernatur qui magni quibusdam. Quam nemo iusto fugiat repudiandae illum pariatur. Ut ipsum harum occaecati laboriosam animi sed voluptatem nesciunt. Inventore sapiente ipsum et. Dicta qui consectetur blanditiis autem. Veritatis a ut repellendus quis ea. Voluptatem quidem repellendus amet id perspiciatis. Excepturi sit expedita saepe enim itaque sint voluptates adipisci accusamus. Dicta debitis et omnis quia labore et non vel. Mollitia atque aut. Nihil autem ut magni voluptas facilis laudantium. Sequi vero omnis consequatur eum nostrum. Maxime voluptatem natus ut.",
"idNo": "989485201610058582",
"socialCode": "GG833760PE3LE3TFF9"
}
]
}
我们可以使用QJsonDocument::fromJson()将JSON文档从基于文本的表示形式转换为QJsonDocument。toJson()将其转换回文本。解析器非常快速和有效,并将JSON转换为Qt使用的二进制表示形式。
我们还可以使用 fromBinaryData() 或 fromRawData() 从存储的二进制表示创建文档。
fromBinaryData(const QByteArray &data, QJsonDocument::DataValidation validation = Validate)
fromRawData(const char *data, int size, QJsonDocument::DataValidation validation = Validate)
fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
这个函数将json解析为UTF-8编码的json文档,并从中创建QJsonDocument。也是最常用的
如果解析成功,返回一个有效的(非空的)QJsonDocument。如果失败,返回的文档将为空,我们还可以通过解析error变量去查询错误的详细信息。
fromVariant(const QVariant &variant)
这个也用的很多,从QVariant 对象创建一个QJsonDocument。这个对象支持的只有如下类,
如果变量包含 QVariantMap、QVariantHash、QVariantList 或 QStringList 以外的任何类型,则返回的文档无效。
1. 从字符串中转换出 QJsonDocument 示例代码:
{
"total": 200,
"data": [
{
"avatar": "http://dummyimage.com/498x200.png/6e4a6b/247832",
"logo": "http://dummyimage.com/100x200.png/0a257b/2a1f0c",
"email": "Mitchell.Rowe51@gmail.com",
"userName": "Bradford Prosacco",
"createAt": 1438303106566,
"birthday": "06/01/2018 05:15",
"age": 11055,
"price": 91378.31,
"homePage": "https://skylar-utools.info",
"phoneNumber": "15096075236",
"city": "Fayetteville 6498 Alexandrea Shoals",
"workAt": "Altenwerth - Stracke",
"uid": "37c07e07-4713-46e1-881f-3217bb362209",
"description": "Eveniet quia quam eos non. Dolorem consectetur neque beatae cumque. Voluptatibus possimus placeat illo in eligendi et. Vel corrupti ipsum et voluptatum eum ullam molestiae maiores. Est a rerum sint et vitae et expedita. Sed minus quia quo minima. Exercitationem laboriosam corrupti id. Sed magni itaque laboriosam. Dicta eum nisi sit. Ad in accusantium quisquam praesentium. Error iste sed.",
"idNo": "372337200906168349",
"socialCode": "U43208743DQUE95M69"
},
{
"avatar": "http://dummyimage.com/444x260.png/777366/581a70",
"logo": "http://dummyimage.com/100x200.png/5d343a/772c02",
"email": "Edd.Nolan@gmail.com",
"userName": "Arnold Gaylord",
"createAt": 1189591090933,
"birthday": "06/13/2019 00:49",
"age": 6715,
"price": 67365.55,
"homePage": "http://lottie-utools.info",
"phoneNumber": "19610566837",
"city": "East Heath 22339 Stokes Summit",
"workAt": "Feil LLC",
"uid": "33039d4d-a1a4-4c95-a993-ef0d7b059a9a",
"description": "Unde facilis qui sapiente rem nemo consequatur beatae consequatur sed. Qui veritatis non ipsam qui consequuntur suscipit deleniti. Iusto doloribus quidem quas ea ut modi eos qui sit. Quisquam sunt neque iure qui quasi aut fugit atque ut. Ratione officia qui qui consequatur corporis esse et. Sit omnis est occaecati. Aliquam quidem soluta quia et cum cumque rerum et qui. Dolores ratione est aspernatur voluptates. Rem sunt culpa omnis voluptas deserunt non alias et quibusdam. Eveniet porro magni laborum. Consequatur fugiat illum voluptatem eos beatae quia exercitationem hic omnis. Omnis cupiditate at aliquam ut quo. Et ducimus aperiam.",
"idNo": "911779201611114210",
"socialCode": "M4731779YDWPKTK49Q"
},
{
"avatar": "http://dummyimage.com/189x114.png/085e64/417806",
"logo": "http://dummyimage.com/100x200.png/6c7c00/565c4d",
"email": "Cecelia.Sauer96@hotmail.com",
"userName": "Theodore Price",
"createAt": 1355674989157,
"birthday": "07/26/2015 20:02",
"age": 39166,
"price": 78955.78,
"homePage": "http://jay-utools.net",
"phoneNumber": "15615929019",
"city": "New Gayle 598 Kaycee Brooks",
"workAt": "Prohaska - Ratke",
"uid": "8128feca-d4f0-454d-8816-f7bfa97d73b4",
"description": "Maxime aut in laudantium aspernatur qui magni quibusdam. Quam nemo iusto fugiat repudiandae illum pariatur. Ut ipsum harum occaecati laboriosam animi sed voluptatem nesciunt. Inventore sapiente ipsum et. Dicta qui consectetur blanditiis autem. Veritatis a ut repellendus quis ea. Voluptatem quidem repellendus amet id perspiciatis. Excepturi sit expedita saepe enim itaque sint voluptates adipisci accusamus. Dicta debitis et omnis quia labore et non vel. Mollitia atque aut. Nihil autem ut magni voluptas facilis laudantium. Sequi vero omnis consequatur eum nostrum. Maxime voluptatem natus ut.",
"idNo": "989485201610058582",
"socialCode": "GG833760PE3LE3TFF9"
}
]
}
//定义的 json字符串
QString m_data = R"({"total":200,"data":[{"avatar":"http://dummyimage.com/498x200.png/6e4a6b/247832","logo":"http://dummyimage.com/100x200.png/0a257b/2a1f0c","email":"Mitchell.Rowe51@gmail.com","userName":"Bradford Prosacco","createAt":1438303106566,"birthday":"06/01/2018 05:15","age":11055,"price":91378.31,"homePage":"https://skylar-utools.info","phoneNumber":"15096075236","city":"Fayetteville 6498 Alexandrea Shoals","workAt":"Altenwerth - Stracke","uid":"37c07e07-4713-46e1-881f-3217bb362209","description":"Eveniet quia quam eos non. Dolorem consectetur neque beatae cumque. Voluptatibus possimus placeat illo in eligendi et. Vel corrupti ipsum et voluptatum eum ullam molestiae maiores. Est a rerum sint et vitae et expedita. Sed minus quia quo minima. Exercitationem laboriosam corrupti id. Sed magni itaque laboriosam. Dicta eum nisi sit. Ad in accusantium quisquam praesentium. Error iste sed.","idNo":"372337200906168349","socialCode":"U43208743DQUE95M69"},{"avatar":"http://dummyimage.com/444x260.png/777366/581a70","logo":"http://dummyimage.com/100x200.png/5d343a/772c02","email":"Edd.Nolan@gmail.com","userName":"Arnold Gaylord","createAt":1189591090933,"birthday":"06/13/2019 00:49","age":6715,"price":67365.55,"homePage":"http://lottie-utools.info","phoneNumber":"19610566837","city":"East Heath 22339 Stokes Summit","workAt":"Feil LLC","uid":"33039d4d-a1a4-4c95-a993-ef0d7b059a9a","description":"Unde facilis qui sapiente rem nemo consequatur beatae consequatur sed. Qui veritatis non ipsam qui consequuntur suscipit deleniti. Iusto doloribus quidem quas ea ut modi eos qui sit. Quisquam sunt neque iure qui quasi aut fugit atque ut. Ratione officia qui qui consequatur corporis esse et. Sit omnis est occaecati. Aliquam quidem soluta quia et cum cumque rerum et qui. Dolores ratione est aspernatur voluptates. Rem sunt culpa omnis voluptas deserunt non alias et quibusdam. Eveniet porro magni laborum. Consequatur fugiat illum voluptatem eos beatae quia exercitationem hic omnis. Omnis cupiditate at aliquam ut quo. Et ducimus aperiam.","idNo":"911779201611114210","socialCode":"M4731779YDWPKTK49Q"},{"avatar":"http://dummyimage.com/189x114.png/085e64/417806","logo":"http://dummyimage.com/100x200.png/6c7c00/565c4d","email":"Cecelia.Sauer96@hotmail.com","userName":"Theodore Price","createAt":1355674989157,"birthday":"07/26/2015 20:02","age":39166,"price":78955.78,"homePage":"http://jay-utools.net","phoneNumber":"15615929019","city":"New Gayle 598 Kaycee Brooks","workAt":"Prohaska - Ratke","uid":"8128feca-d4f0-454d-8816-f7bfa97d73b4","description":"Maxime aut in laudantium aspernatur qui magni quibusdam. Quam nemo iusto fugiat repudiandae illum pariatur. Ut ipsum harum occaecati laboriosam animi sed voluptatem nesciunt. Inventore sapiente ipsum et. Dicta qui consectetur blanditiis autem. Veritatis a ut repellendus quis ea. Voluptatem quidem repellendus amet id perspiciatis. Excepturi sit expedita saepe enim itaque sint voluptates adipisci accusamus. Dicta debitis et omnis quia labore et non vel. Mollitia atque aut. Nihil autem ut magni voluptas facilis laudantium. Sequi vero omnis consequatur eum nostrum. Maxime voluptatem natus ut.","idNo":"989485201610058582","socialCode":"GG833760PE3LE3TFF9"}]})";
void QJsonUse::testJsonDocument()
{
//把 QString 转换为 QJsonDocument
QJsonDocument doc = QJsonDocument::fromJson(m_data.toLocal8Bit());
if(doc.isNull() || doc.isEmpty()){
qDebug()<<"[info] : document maybe null or empty";
}
else{
if(doc.isObject()){
qDebug()<<"[info] : documen is an object";
QJsonObject obj = doc.object();
if(obj.contains("total")){
qDebug()<<tr("total = %1").arg(obj.value("total").toInt());
}
if(obj.contains("data")){
qDebug()<<tr("data{");
QJsonArray data_array = obj.value("data").toArray();
foreach (auto item, data_array) {
if(!item.isObject()) continue;
QJsonObject m_object = item.toObject();
if(m_object.contains("avatar")) qDebug()<<"\tavatar = "<<m_object.value("avatar").toString();
if(m_object.contains("logo")) qDebug()<<"\tlogo = "<<m_object.value("logo").toString();
if(m_object.contains("email")) qDebug()<<"\temail = "<<m_object.value("email").toString();
if(m_object.contains("userName")) qDebug()<<"\tuserName = "<<m_object.value("userName").toString();
if(m_object.contains("createAt")) qDebug()<<"\tcreateAt = "<<m_object.value("createAt").toString();
if(m_object.contains("birthday")) qDebug()<<"\tbirthday = "<<m_object.value("birthday").toString();
if(m_object.contains("age")) qDebug()<<"\tage = "<<m_object.value("age").toInt();
if(m_object.contains("price")) qDebug()<<"\tprice = "<<m_object.value("price").toDouble();
if(m_object.contains("homePage")) qDebug()<<"\thomePage = "<<m_object.value("homePage").toString();
if(m_object.contains("phoneNumber")) qDebug()<<"\tphoneNumber = "<<m_object.value("phoneNumber").toString();
if(m_object.contains("city")) qDebug()<<"\tcity = "<<m_object.value("city").toString();
if(m_object.contains("workAt")) qDebug()<<"\tworkAt = "<<m_object.value("workAt").toString();
if(m_object.contains("uid")) qDebug()<<"\tuid = "<<m_object.value("uid").toString();
if(m_object.contains("description")) qDebug()<<"\tdescription = "<<m_object.value("description").toString();
if(m_object.contains("idNo")) qDebug()<<"\tidNo = "<<m_object.value("idNo").toString();
if(m_object.contains("socialCode")) qDebug()<<"\tsocialCode = "<<m_object.value("socialCode").toString() <<"\n";
}
qDebug()<<tr("}");
}
}
if(doc.isArray()){
qDebug()<<"documen is an array";
}
}
}
2. 从QVariantMap 对象获取
{
"addr": [
"ew",
"ew",
"fd"
],
"code": 203,
"code": 203,
"id": 1,
"info": {
"age": 39166,
"avatar": "http://dummyimage.com/189x114.png/085e64/417806",
"createAt": 1355674989157,
"email": "Cecelia.Sauer96@hotmail.com",
"logo": "http://dummyimage.com/100x200.png/6c7c00/565c4d",
"userName": "Theodore Price"
}
}
void QJsonUse::testJsonDocumentFromQVarientMap()
{
QMap<QString, QVariant> topMap;
QMap<QString, QVariant> secondMap;
secondMap.insert("avatar", "http://dummyimage.com/189x114.png/085e64/417806");
secondMap.insert("logo", "http://dummyimage.com/100x200.png/6c7c00/565c4d");
secondMap.insert("email", "Cecelia.Sauer96@hotmail.com");
secondMap.insert("userName", "Theodore Price");
secondMap.insert("createAt", 1355674989157);
secondMap.insert("age", 39166);
topMap.insert("id", 1);
topMap.insert("code", 203);
topMap.insert("addr", QVariant(QList<QString>{"ew", "ew", "fd"}));
topMap.insert("info", secondMap);
QJsonDocument doc = QJsonDocument::fromVariant(QVariant(topMap));
qDebug()<<doc.toJson(QJsonDocument::Indented).data();
}
为了安全起见,我们最好在使用 Json的时候一定要去校验JSON的正确性,
isNull() 可以查询已解析Json文档的有效性。isEmpty() 是去查看已经解析Json是否是空数据
我们还可以使用 isArray() 和 isObject() 查询文档是否包含数组或对象。
然后就是使用 array() 或 object() 检索文档中包含的数组或对象,然后读取或操作。
我们可以使用 toJson() 把这个Json对象转换为字符串,还可以知道是否是压缩或者展开的格式
//展开格式
{
"Array": [
true,
999,
"string"
],
"Key": "Value",
"null": null
}
//压缩格式 QJsonDocument::Compact
{"Array":[true,999,"string"],"Key":"Value","null":null}
也可以使用 toVariant() 将JSON对象直接转换为 QVariant类型