您的位置:首页 > 编程语言 > Qt开发

QT Json解析方法

2016-02-28 10:57 459 查看
QT 与WEB的交互,大部分就是客户端与网页的交互,有时,我们需要得到服务器返回的具体的数据,就通过客户端与网页交互的过程中拿到所需要的参数,在我的另一篇博文中有讲到过http://blog.csdn.net/li235456789/article/details/50737777 怎么去获取网页返回的链接里面对应的每个参数。 再通过这个参数, 我们使用http协议,用get或者post 方式把进行数据的请求或者上传, 无论请求成功与否,上传成功与否,当请求对象绑定了finished()的信号时,就会返回对应的json数据,要获取json数据中的具体的内容,这就需要进行json解析。

而QT 没有自带解析json数据的库,这就需要我们添加新json数据解析的库。在我的下载资源里面可以找 "解析json数据源码", 因为是才开始上传的,拿不到外链,这里没源贴外链出来。这个里面就有对应的json数据解析的所需的库源码。

下面是客户端代码实现:

加上对应的头文件:

#include "qjson/parser.h"

#include "qjson/serializer.h"

QByteArray resultDate;

resultDate = 对应的需要解析的json 数据。

QJson::Parser parser;

bool ok = false;

const QVariant data = parser.parse(resultDate, &ok);

//这里把QByteArray 数据转换为 QVariant数据类型。

const QVariantMap dataMap = data.toMap();

//这里再把QVariant转换为QVariantMap, 因为json数据里面的键值是相互对应的,一个键对应一个值。

QVariantMap record = dataMap;

const QString errorCode = dataMap.value(m_opt.common.key.errorCode).toString();

//在这里如果json数据里面,是不包含数组的, 就一个最简单的形式如同下面这种:

{"error_code":"0","error_msg":"","age":26,"comic_member":"Y","comic_member_time":"1539057544"}

就可以直接用const QString errorCode = dataMap.value(m_opt.common.key.errorCode).toString();这种形式获取到,这里是获取errorCode的值 , 返回为0保存在const QString errorCode 的结果里面。这里注意到一个 m_opt.common.key.errorCode 这里在我们项目里其实它是一个结构体, 保存着xml里面的默认的值, 它等同于tr("error_code"),

所以,如果你不同xml保存对应json的默认键值的话就可以写为:

const QString errorCode = dataMap.value(tr("error_code")).toString();

当然,写成xml保存的话,结构条理清晰一点,代码可以看起来规范一点,不那么乱。

上面介绍了一种简单的json解析,当然有些json数据会复杂很多,再根据实际情况来进行处理,比如说:

{"error_code":"0","error_msg":"","comic_class":"V","comic_class_name":"\u6709\u97f3\u6f2b\u753b","comic_type":"A","comic_type_name":"\u7ae5\u8bdd\u7cfb\u5217","is_compilations":"N","compilations_id":"0","compilations_name":null,"compilations_en_name":null,"comic_name":"\u96ea\u5973\u738b","comic_info":{"comic_id":"189","comic_class":"V","comic_type":"A","comic_name":"\u96ea\u5973\u738b","comic_level":"A\/B\/C","author":"\u8f66\u661f\u73cd
\u60f3\u8c61\u5de5\u5382","synopsis":"\u4e0d\u53ef\u601d\u8bae\u7684\u6f2b\u753b\u82f1\u8bed-\u6fc0\u53d1\u5b69\u5b50\u5b66\u4e60\u82f1\u8bed\u7684\u5174\u8da3\uff0c\u63ed\u53d1\u82f1\u8bed\u5b66\u4e60\u7684\u771f\u76f8\uff0c\u88ab\u5e7f\u5927\u5b66\u751f\u3001\u5bb6\u957f\u548c\u8001\u5e08\u79f0\u4e3a\"\u795e\u5947\u7684\u7ae5\u8bdd\u4e66\"\u548c\"\u63d0\u9ad8\u82f1\u8bed\u6c34\u5e73\u7684\u79d8\u7c4d\"\u3002\r\n\u5b69\u5b50\u4eec\u53ea\u5728\u5b66\u6821\u5b66\u4e60\u82f1\u8bed\uff0c\u662f\u8fdc\u8fdc\u4e0d\u591f\u7684\u3002\u5bb6\u957f\u4eec\u7684\u70ed\u60c5\u4ecb\u5165\uff0c\u662f\u63d0\u9ad8\u5b69\u5b50\u82f1\u8bed\u6c34\u5e73\u7684\u4e00\u4e2a\u5173\u952e\u56e0\u7d20\u3002\u300aWOW\uff01\u4e0d\u53ef\u601d\u8bae\u7684\u6f2b\u753b\u82f1\u8bed\u300b\u662f\u4e00\u5957\u9002\u5408\u5728\u5bb6\u5ead\u5185\u90e8\u4e92\u52a8\u5b66\u4e60\u7684\u4e1b\u4e66\uff0c\u4ece\u8ddf\u8bfb\u53e5\u5b50\uff0c\u5230\u89d2\u8272\u626e\u6f14\u6e38\u620f\uff0c\u5b69\u5b50\u4eec\u7684\u82f1\u8bed\u80fd\u529b\u4f1a\u5728\u9605\u8bfb\u7ecf\u5178\u7ae5\u8bdd\u6545\u4e8b\u4e2d\u5f97\u5230\u63d0\u9ad8\u3002\r\n\u3002\u300aWOW\uff01\u4e0d\u53ef\u601d\u8bae\u7684\u6f2b\u753b\u82f1\u8bed\u300b\u9009\u53d6\u4e86\u5c0f\u670b\u53cb\u4eec\u6700\u559c\u7231\u7684\u7ae5\u8bdd\u6545\u4e8b\uff0c\u5bd3\u6559\u4e8e\u4e50\uff0c\u8ba9\u5c0f\u670b\u53cb\u4eec\u5728\u9605\u8bfb\u6545\u4e8b\u7684\u4e50\u8da3\u4e2d\u5b66\u4e60\u82f1\u8bed\uff0c\u51cf\u8f7b\u4e86\u4ed6\u4eec\u7684\u5b66\u4e60\u538b\u529b\u3002","total_episodes":"6","upload_episodes":"5","click_times":"6841","r_create_staff":"test9","r_create_time":"2014-08-11
10:54:47","r_modify_staff":"feng","r_modify_time":"2015-07-07 10:38:46","comic_status":"Y","comment_times":"12","comment_scores":"99.9","comic_name_en":"\u96ea\u5973\u738b","is_compilations":"N","compilations_id":"0","is_learning":null},"downloadinfo":[{"fe":"3","title":"\u96ea\u5973\u738b03","image_list":[{"image_id":"3263","image_url":"03-1.jpg","start":"1","over":"2"},{"image_id":"3264","image_url":"03-2.jpg","start":"3","over":"9"},{"image_id":"3266","image_url":"03-3.jpg","start":"10","over":"13"},{"image_id":"3267","image_url":"03-4.jpg","start":"14","over":"20"},{"image_id":"3268","image_url":"03-5.jpg","start":"21","over":"27"},{"image_id":"3270","image_url":"03-6.jpg","start":"28","over":"33"},{"image_id":"3272","image_url":"03-7.jpg","start":"34","over":"41"},{"image_id":"3273","image_url":"03-8.jpg","start":"42","over":"47"},{"image_id":"3274","image_url":"03-9.jpg","start":"48","over":"53"}]}]}

这种有数组的就麻烦一些:

const QVariant list = record.value(m_opt.geturl.key.relist);

if (list.isValid() && list.canConvert<QVariantList>()) {

foreach (const QVariant& m, list.toList()) {

QVariantMap details = m.toMap();

result.setComicName(record.value(m_opt.geturl.key.comicName).toString());

..........

const QVariant imageLis = details.value(m_opt.geturl.key.comicImageList);

foreach(const QVariant& imageLt, imageLis.toList()) {

QVariantMap imageDetails = imageLt.toMap();

result.setComicImageId(imageDetails.value(m_opt.geturl.key.comicImageId).toInt());

................

}

}

}

这种包含数组的json数据就需要一层一层把所有数据解析出来。

另外有一种可以在线看清json数据格式的工具:
http://www.bejson.com/jsoneditoronline/
可以把对应的格式看出来。



它就可以清晰地看出对应的json结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: