# QT解析Json 原始数据如下: ```json { "cityid": "101130101", "update_time": "2019-04-11 11:30:00", "city": "乌鲁木齐", "cityEn": "wulumuqi", "country": "中国", "countryEn": "China", "data": [ { "day": "11日(今天)", "date": "2019-04-11", "week": "星期四", "wea": "多云", "wea_img": "yun", "air": 52, "humidity": 16, "air_level": "良", "air_tips": "空气好,可以外出活动,除极少数对污染物特别敏感的人群以外,对公众没有危害!", "alarm": { "alarm_type": "", "alarm_level": "", "alarm_content": "" }, "tem1": "16℃", "tem2": "9℃", "tem": "16℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "11日08时", "wea": "阴", "tem": "10℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "11日11时", "wea": "多云", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "11日14时", "wea": "多云", "tem": "16℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "11日17时", "wea": "多云", "tem": "13℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "11日20时", "wea": "多云", "tem": "13℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "11日23时", "wea": "多云", "tem": "9℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日02时", "wea": "多云", "tem": "11℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日05时", "wea": "多云", "tem": "12℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "弱", "desc": "辐射较弱,涂擦SPF12-15、PA+护肤品。" }, { "title": "", "level": null, "desc": "春天不减肥,夏天徒伤悲。天气较舒适,快去运动吧。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较冷", "desc": "建议着厚外套加毛衣等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] }, { "day": "12日(明天)", "date": "2019-04-12", "week": "星期五", "wea": "多云", "wea_img": "yun", "tem1": "17℃", "tem2": "9℃", "tem": "12℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "12日08时", "wea": "多云", "tem": "12℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日11时", "wea": "多云", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日14时", "wea": "多云", "tem": "15℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日17时", "wea": "多云", "tem": "17℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日20时", "wea": "多云", "tem": "15℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "12日23时", "wea": "多云", "tem": "11℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日02时", "wea": "多云", "tem": "11℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日05时", "wea": "多云", "tem": "11℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "弱", "desc": "辐射较弱,涂擦SPF12-15、PA+护肤品。" }, { "title": "", "level": null, "desc": "春天不减肥,夏天徒伤悲。天气较舒适,快去运动吧。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较冷", "desc": "建议着厚外套加毛衣等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] }, { "day": "13日(后天)", "date": "2019-04-13", "week": "星期六", "wea": "晴", "wea_img": "qing", "tem1": "20℃", "tem2": "9℃", "tem": "9℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "13日08时", "wea": "多云", "tem": "9℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日11时", "wea": "晴", "tem": "16℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日14时", "wea": "晴", "tem": "20℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日17时", "wea": "晴", "tem": "19℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日20时", "wea": "晴", "tem": "16℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "13日23时", "wea": "晴", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "14日02时", "wea": "晴", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "14日05时", "wea": "晴", "tem": "9℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "中等", "desc": "涂擦SPF大于15、PA+防晒护肤品。" }, { "title": "减肥指数", "level": null, "desc": "天气较舒适,减肥正当时。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较舒适", "desc": "建议穿薄外套或牛仔裤等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] }, { "day": "14日(周日)", "date": "2019-04-14", "week": "星期日", "wea": "多云转晴", "wea_img": "yun", "tem1": "18℃", "tem2": "8℃", "tem": "9℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "14日08时", "wea": "晴", "tem": "9℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "14日14时", "wea": "多云", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "14日20时", "wea": "多云", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "15日02时", "wea": "晴", "tem": "9℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "弱", "desc": "辐射较弱,涂擦SPF12-15、PA+护肤品。" }, { "title": "减肥指数", "level": null, "desc": "春天不减肥,夏天徒伤悲。天气较舒适,快去运动吧。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较冷", "desc": "建议着厚外套加毛衣等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] }, { "day": "15日(周一)", "date": "2019-04-15", "week": "星期一", "wea": "晴转多云", "wea_img": "yun", "tem1": "21℃", "tem2": "10℃", "tem": "9℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "15日08时", "wea": "晴", "tem": "9℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "15日14时", "wea": "晴", "tem": "20℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "15日20时", "wea": "晴", "tem": "17℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "16日02时", "wea": "多云", "tem": "13℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "中等", "desc": "涂擦SPF大于15、PA+防晒护肤品。" }, { "title": "减肥指数", "level": null, "desc": "天气较舒适,减肥正当时。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较舒适", "desc": "建议穿薄外套或牛仔裤等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] }, { "day": "16日(周二)", "date": "2019-04-16", "week": "星期二", "wea": "多云", "wea_img": "yun", "tem1": "19℃", "tem2": "7℃", "tem": "10℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "16日08时", "wea": "多云", "tem": "10℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "16日14时", "wea": "多云", "tem": "18℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "16日20时", "wea": "多云", "tem": "15℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "17日02时", "wea": "多云", "tem": "13℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "弱", "desc": "辐射较弱,涂擦SPF12-15、PA+护肤品。" }, { "title": "减肥指数", "level": null, "desc": "天气较舒适,减肥正当时。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较舒适", "desc": "建议穿薄外套或牛仔裤等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] }, { "day": "17日(周三)", "date": "2019-04-17", "week": "星期三", "wea": "多云", "wea_img": "yun", "tem1": "19℃", "tem2": "7℃", "tem": "7℃", "win": [ "无持续风向", "无持续风向" ], "win_speed": "<3级", "hours": [ { "day": "17日08时", "wea": "多云", "tem": "7℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "17日14时", "wea": "多云", "tem": "18℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "17日20时", "wea": "多云", "tem": "14℃", "win": "无持续风向", "win_speed": "<3级" }, { "day": "18日02时", "wea": "多云", "tem": "8℃", "win": "无持续风向", "win_speed": "<3级" } ], "index": [ { "title": "紫外线指数", "level": "弱", "desc": "辐射较弱,涂擦SPF12-15、PA+护肤品。" }, { "title": "减肥指数", "level": null, "desc": "天气较舒适,减肥正当时。" }, { "title": "健臻·血糖指数", "level": "较易波动", "desc": "血糖较易波动,注意监测。" }, { "title": "穿衣指数", "level": "较舒适", "desc": "建议穿薄外套或牛仔裤等服装。" }, { "title": "洗车指数", "level": "较适宜", "desc": "无雨且风力较小,易保持清洁度。" }, { "title": "空气污染扩散指数", "level": "中", "desc": "易感人群应适当减少室外活动。" } ] } ] } ``` ​ 将其保存为`utf-8`的文本文件,并将后缀名修改为`json`,用`Firfox`打开,可以看到json文件的具体信息: 可以看到,实现是普通的字典对:{"city":"乌鲁木齐"},然后是data对应的数组。 Json解析方法如下:![1555078964052](assets/1555078964052-1559398268455.png) 1. 首先使用QFile::readAll()读取Json数据 2. 使用QJsonDocment::fromjson()得到QJsonDocment对象 ```c++ #include #include #include #include #include #include #include #include #include int main(int argc,char *argv[]){ QCoreApplication a(argc, argv); // 打开Json文件 QFile file("E:\\Project\\Qt\\QJson\\w.json"); file.open(QIODevice::ReadOnly); //创建QJsonDocment对象 QJsonParseError json_error; QJsonDocument json_doc=QJsonDocument::fromJson(file.readAll(),&json_error); if(json_error.error!=QJsonParseError::NoError) qDebug()< 输出结果: > > "乌鲁木齐" ## 读取一级数组 ​ 在上面写出的Json中,`data`代表了Json数据的一个数组,用于储存乌鲁木齐市七天的天气状况: ![1555078226990](assets/1555078226990.png) ​ 要读取数组,实现对`QJsonDocment`进行下标索引,获得`data`键对应的`QJsonValue`,其实际代表一个`Array`,因此,将其使用`toArray()`方法得到实际的类型,再对每一个Array项先转换为`QJsonObject`,然后进行索引,并转换为`QString`: ```c++ QJsonValue jsonVal=json_doc["data"]; QJsonArray jsonArr=jsonVal.toArray();//得到数组对象 foreach(QJsonValue x,jsonArr){// 对数组对象进行迭代 qDebug()<<"读取二级键值[\"day\"]"< 输出结果: > > 读取二级键值["day"] "11日(今天)" > 读取二级键值["day"] "12日(明天)" > 读取二级键值["day"] "13日(后天)" > 读取二级键值["day"] "14日(周日)" > 读取二级键值["day"] "15日(周一)" > 读取二级键值["day"] "16日(周二)" > 读取二级键值["day"] "17日(周三)" ## 读取三级键值 ​ 上面的Json数据中,以index数组为例,数据嵌套的关系为: ​ $Json数据\leftarrow data数组\leftarrow index数组$ 下面读取嵌套在`data数组中的index数组`: ![1555078306800](assets/1555078306800.png) ​ 思路和上面一样,实现将`jsonArr`对象进行索引,再通过`QJsonObject`为中介,得到`index`代表的数组: ```c++ QJsonArray jsonArr2=jsonArr[0].toObject()["index"].toArray();//得到index数组对应的对象 foreach(QJsonValue x,jsonArr2){ qDebug()< 输出结果为: > > 二级数组: "弱" > 二级数组: "" > 二级数组: "较易波动" > 二级数组: "较冷" > 二级数组: "较适宜" > 二级数组: "中" ## 读取数组的全部代码 ```c++ #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 打开Json文件 QFile file("E:\\Project\\Qt\\QJson\\w.json"); file.open(QIODevice::ReadOnly); //创建QJsonDoc对象 QJsonParseError json_error; QJsonDocument json_doc=QJsonDocument::fromJson(file.readAll(),&json_error); if(json_error.error!=QJsonParseError::NoError) qDebug()< 输出结果为: > > 读取一级键值["city"]: "乌鲁木齐" > 读取二级键值["day"] "11日(今天)" > 读取二级键值["day"] "12日(明天)" > 读取二级键值["day"] "13日(后天)" > 读取二级键值["day"] "14日(周日)" > 读取二级键值["day"] "15日(周一)" > 读取二级键值["day"] "16日(周二)" > 读取二级键值["day"] "17日(周三)" > 二级数组: "弱" > 二级数组: "" > 二级数组: "较易波动" > 二级数组: "较冷" > 二级数组: "较适宜" > 二级数组: "中" ​ 对于其他级别的嵌套数组,也就是不断的转换对象了。 ## 一个特殊的QJsonObject对象 实现观察高亮部分: ![1555078964052](assets/1555078964052.png) ​ `firefox`对Json的数组进行了编号,直观体现就是`data数组和index数组`的项上级都有`0,1,2,3`这样的标号。但是高亮部分对应的`alarm`项却没有进行编号,可以认为,`alarm不是一个数组`。 **实现查看alarm**的实际类型: ```c++ qDebug()< 输出结果为: > > 5 查看`type()`对应的文档,可以看到type()返回一个QJsonValue的枚举值,5代表的是`QJsonObject`。 既然`alarm代表的是一个QJsonObject对象`,那么获取键值直接对其进行索引即可: ```c++ qDebug()< 输出结果为: > > QJsonValue(string, "")