1 JSON数据简介

  JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

  JSON解析一定要掌握的两条规则:

    1.如果看到是{ }–>使用JSONObject

    2.如果看到的[ ]–>使用JSONArray解析

2 Qt中的JSON操作

3 DEMO

  以和风天气的常规天气数据集合为例来解析JSON数据,原始的JSON数据显示到textEdit中



  可以将原始的JSON数据复制到 http://www.bejson.com/ 进行解析,解析的结果如下:

{
"HeWeather6":[
{
"basic":{
"cid":"CN101050116",
"location":"道外",
"parent_city":"哈尔滨",
"admin_area":"黑龙江",
"cnty":"中国",
"lat":"45.78453827",
"lon":"126.64883423",
"tz":"+8.00"
},
"update":{
"loc":"2018-09-26 15:45",
"utc":"2018-09-26 07:45"
},
"status":"ok",
"now":{
"cloud":"25",
"cond_code":"100",
"cond_txt":"晴",
"fl":"18",
"hum":"52",
"pcpn":"0.0",
"pres":"1022",
"tmp":"19",
"vis":"10",
"wind_deg":"122",
"wind_dir":"东南风",
"wind_sc":"1",
"wind_spd":"5"
},
"daily_forecast":[
{
"cond_code_d":"100",
"cond_code_n":"100",
"cond_txt_d":"晴",
"cond_txt_n":"晴",
"date":"2018-09-26",
"hum":"61",
"mr":"18:18",
"ms":"06:07",
"pcpn":"0.0",
"pop":"2",
"pres":"1024",
"sr":"05:26",
"ss":"17:21",
"tmp_max":"20",
"tmp_min":"6",
"uv_index":"6",
"vis":"20",
"wind_deg":"193",
"wind_dir":"西南风",
"wind_sc":"3-4",
"wind_spd":"20"
},
{
"cond_code_d":"101",
"cond_code_n":"100",
"cond_txt_d":"多云",
"cond_txt_n":"晴",
"date":"2018-09-27",
"hum":"61",
"mr":"18:44",
"ms":"07:13",
"pcpn":"0.0",
"pop":"25",
"pres":"1023",
"sr":"05:27",
"ss":"17:19",
"tmp_max":"20",
"tmp_min":"8",
"uv_index":"3",
"vis":"20",
"wind_deg":"170",
"wind_dir":"南风",
"wind_sc":"3-4",
"wind_spd":"12"
},
{
"cond_code_d":"305",
"cond_code_n":"101",
"cond_txt_d":"小雨",
"cond_txt_n":"多云",
"date":"2018-09-28",
"hum":"70",
"mr":"19:14",
"ms":"08:20",
"pcpn":"6.0",
"pop":"80",
"pres":"1018",
"sr":"05:29",
"ss":"17:17",
"tmp_max":"18",
"tmp_min":"10",
"uv_index":"2",
"vis":"20",
"wind_deg":"160",
"wind_dir":"东南风",
"wind_sc":"3-4",
"wind_spd":"12"
}
],
"lifestyle":[
{
"type":"comf",
"brf":"舒适",
"txt":"白天不太热也不太冷,风力不大,相信您在这样的天气条件下,应会感到比较清爽和舒适。"
},
{
"type":"drsg",
"brf":"较舒适",
"txt":"建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。"
},
{
"type":"flu",
"brf":"较易发",
"txt":"天气较凉,较易发生感冒,请适当增加衣服。体质较弱的朋友尤其应该注意防护。"
},
{
"type":"sport",
"brf":"较适宜",
"txt":"天气较好,但因风力稍强,户外可选择对风力要求不高的运动,推荐您进行室内运动。"
},
{
"type":"trav",
"brf":"适宜",
"txt":"天气较好,风稍大,但温度适宜,是个好天气哦。适宜旅游,您可以尽情地享受大自然的无限风光。"
},
{
"type":"uv",
"brf":"中等",
"txt":"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
},
{
"type":"cw",
"brf":"较适宜",
"txt":"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"
},
{
"type":"air",
"brf":"良",
"txt":"气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。"
}
]
}
]
}

代码如下

.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2018-09-21T21:19:38
#
#------------------------------------------------- QT += core gui
QT += network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = myHTTP
TEMPLATE = app SOURCES += main.cpp\
mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QNetworkAccessManager>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
#include <QJsonArray> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void DecodeJson(QString JsonData); //解析Json数据
QString cid;
QString location;
QString parent_city;
QString loc;
QString status;
QString cond_code_d;
QString cond_txt_d;
QString cmf;
QString air;
private:
QNetworkAccessManager *manager;
Ui::MainWindow *ui;
private slots:
void replyFinished(QNetworkReply *);
}; #endif // MAINWINDOW_H

  mainwindow.h中声明了几个变量,一个用来解析Json数据的函数,一个槽函数,仅此而已。

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h" #define WEATHER_URL "https://free-api.heweather.com/s6/weather?location=CN101050116&key=0db7704826964aabafc351a52384225b" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager=new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),
this,SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl(WEATHER_URL)));
}
void MainWindow::replyFinished(QNetworkReply *reply)
{ QString all=reply->readAll(); //all数据只用来显示
ui->textEdit->setText(all);
DecodeJson(all);
reply->deleteLater();
}
//用来解析Jsong数据
void MainWindow::DecodeJson(QString JsonData)
{
QJsonParseError json_error;
QByteArray byteArray = JsonData.toUtf8();
//转换为JsonDoucument文档
QJsonDocument json_doucment = QJsonDocument::fromJson(byteArray, &json_error);
if(json_error.error != QJsonParseError::NoError)
{
qDebug()<<"解析数据错误"<<endl;
return ;
}
QJsonArray json_array;
if(json_doucment.object().contains("HeWeather6"))
{
qDebug()<<"HeWeather6"<<endl;
json_array=json_doucment.object().value("HeWeather6").toArray();
}
QJsonObject main_json_data=json_array.at(0).toObject();
if(main_json_data.contains("basic"))
{
QJsonObject basc_json_data=main_json_data.value("basic").toObject();
cid=basc_json_data.value("cid").toString();
location=basc_json_data.value("location").toString();
parent_city=basc_json_data.value("parent_city").toString();
qDebug()<<cid<<endl;
qDebug()<<parent_city<<endl;
}
if(main_json_data.contains("update"))
{
QJsonObject update_json_data=main_json_data.value("update").toObject();
loc=update_json_data.value("loc").toString();
qDebug()<<loc<<endl;
}
if(main_json_data.contains("status"))
{
status=main_json_data.value("status").toString();
qDebug()<<status<<endl;
}
if(main_json_data.contains("now"))
{ }
if(main_json_data.contains("daily_forecast"))
{
qDebug()<<"daily_forecast"<<endl;
QJsonArray daily_forecast_array=main_json_data.value("daily_forecast").toArray();
//Today天气
QJsonObject today_forecast=daily_forecast_array.at(0).toObject();
cond_code_d=today_forecast.value("cond_code_d").toString();
cond_txt_d=today_forecast.value("cond_txt_d").toString();
qDebug()<<cond_code_d<<endl;
qDebug()<<"cond_txt_d="<<cond_txt_d<<endl;
//Tomorrow天气
QJsonObject tomorrow_forecast=daily_forecast_array.at(1).toObject();
cond_code_d=tomorrow_forecast.value("cond_code_d").toString();
cond_txt_d=tomorrow_forecast.value("cond_txt_d").toString();
qDebug()<<cond_code_d<<endl;
qDebug()<<"cond_txt_d="<<cond_txt_d<<endl;
}
if(main_json_data.contains("lifestyle"))
{
QJsonArray lifestyle_json_array=main_json_data.value("lifestyle").toArray();
QJsonObject comf_josn_object=lifestyle_json_array.at(0).toObject();
cmf=comf_josn_object.value("txt").toString();
qDebug()<<cmf<<endl;
QJsonObject air_josn_object=lifestyle_json_array.at(7).toObject();
air=air_josn_object.value("txt").toString();
qDebug()<<air<<endl; } } MainWindow::~MainWindow()
{
delete ui;
}

mian.cpp

/*
* 程序说明:
* 以和风天气的常规天气数据集合为例,解析Json数据
*/
#include "mainwindow.h"
#include <QtNetwork>
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}

  解析出来的数据用qDebug()打印出来,可以和刚才的数据比较一下,看解析的是否正确

参考资料

和风天气 https://www.heweather.com/documents/api/s6/weather

Qt中的JSON操作 https://blog.csdn.net/Amnes1a/article/details/68957112

JSON的三种解析方式 https://www.cnblogs.com/zhujiabin/p/5498272.html

这一篇文章写的很好 https://blog.csdn.net/miaozhenzhong/article/details/52585726

JSON数据在线解析 http://www.bejson.com/

偷懒不想写了2018/9/26

Qt解析Json数据的更多相关文章

  1. QT使用QJson生成解析Json数据的方法

    QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...

  2. Qt QJson解析json数据

    Qt QJson解析json数据 //加载根目录文件 void TeslaManageData::loadRootFolderFiles() { QNetworkAccessManager *mana ...

  3. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  4. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  5. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  6. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  7. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  8. fastjson生成和解析json数据,序列化和反序列化数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

  9. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

随机推荐

  1. ssh客户端连接报认证失败

    最近有个应用在并发导出的时候,报错了ssh认证失败,原来串行的时候都正常,经查,可能是ssh连接数不够的原因,这个问题刚好之前有个java开发反馈过,linux默认的ssh连接数为10个. 解决如下: ...

  2. 01:jQuery的下拉选select2插件用法

    1.1 select2插件基本使用 1.下载select2插件 1. 下载地址:https://github.com/select2/select2 2.官网地址:https://select2.or ...

  3. 【4opencv】CLR基本原理和如何运用于GOCW

    GOCW的重点和难点就在于Csharp调用OpenCV,其中的桥梁就是CLR,当然我们也有其他方法,但是CLR是一个比较新的.比较可靠的.关键是能用的桥梁.这里关于CLR的基本原理知识.如何用于GOC ...

  4. QT---实现舒尔特方格(零基础入门)

    按照之前说的,加上舒尔特方格,读者还可以自行将此游戏做成APP放到手机上,后面还有贪吃蛇,Java版的飞机大战,五子棋,各类游戏会不断加上来的,当然,会免费附加源代码! 读者可以去4399去玩一下,可 ...

  5. rsync命令解析

    !rsync同步模式sync在进行同步或备份时,使用远程shell,或TCP连接远程daemon,有两种途经连接远程主机.shell模式,不需要使用配置文件,也不需要启动远端rsync.远程传输时一般 ...

  6. How to use Junit Listener

    JUnit Listeners If you want to do some operations when your tests are started, passed, finished, fai ...

  7. Spring Boot 笔记之 MVC 分层结构

    视图层view:用于展示数据,与用户进行交互. 控制层controller:用于分发控制到来的请求,并将请求分发给相应的业务层.以及将数据返回给视图层展示. 业务层service:业务处理,调用数据访 ...

  8. SpringBoot 利用过滤器Filter修改请求url地址

    要求: 代码中配置的url路径为http://127.0.0.1/api/associates/queryAssociatesInfo 现在要求http://127.0.0.1/associates/ ...

  9. R t-test cor.test

    a = c(175, 168, 168, 190, 156, 181, 182, 175, 174, 179)b = c(185, 169, 173, 173, 188, 186, 175, 174, ...

  10. (转载)winform图片标尺控件

    最近要做个winform的东西,要在里面集成一个类似Windows自带画图的标尺功能,还要能在图片上画矩形框.在网上找了好久也没找到写好的控件,无奈自己做了一个. 目前还有些bug,这里先做个分享.( ...