影刀高级-JSON
一、JSON简介
1. import json.py
都集中到一块了。有一些细节需注意。加s和不加s的区别,
import json
data_json ='''{
"城市":"杭州",
"温度":28.5,
"天气":"晴朗",
"预报":["多云","晴朗","雷阵雨"],
"湿度":60,
"风":{"方向":"东南","速度":10.5},
"空气质量":null,
"是否节假日":true
}'''
data_python ={
"城市":"杭州",
"温度":28.5,
"天气":"晴朗",
"预报":["多云","晴朗","雷阵雨"],
"湿度":60,
"风":{"方向":"东南","速度":10.5},
"空气质量":None,
"是否节假日":True
}
data_python =json.loads(data_json)
print(data_python,type(data_python),sep="\n")
data_python =json.load(open("data_json.json", encoding='utf-8'))
print(data_python,type(data_python),sep="\n")
data_jsonP=json.dumps(data_python,ensure_ascii=False)
print(data_jsonP,type(data_jsonP),sep='\n')
data_jsonW=json.dump(data_python,open("data_jsonW.json","w",encoding="utf-8"),ensure_ascii=False,indent=4)运行结果:
{'城市': '杭州', '温度': 28.5, '天气': '晴朗', '预报': ['多云', '晴朗', '雷阵雨'], '湿度': 60, '风': {'方向': '东南', '速度': 10.5}, '空气质量': None, '是否节假日': True}
<class 'dict'>
{'城市': '杭州', '温度': 28.5, '天气': '晴朗', '预报': ['多云', '晴朗', '雷阵雨'], '湿度': 60, '风': {'方向': '东南', '速度': 10.5}, '空气质量': None, '是否节假日': True}
<class 'dict'>
{"城市": "杭州", "温度": 28.5, "天气": "晴朗", "预报": ["多云", "晴朗", "雷阵雨"], "湿度": 60, "风": {"方向": "东南", "速度": 10.5}, "空气质量": null, "是否节假日": true}
<class 'str'>https://www.xinyizhishu.top/yingdaoC/import json.py
2.data_json.json
{
"城市":"杭州",
"温度":28.5,
"天气":"晴朗",
"预报":["多云","晴朗","雷阵雨"],
"湿度":60,
"风":{"方向":"东南","速度":10.5},
"空气质量":null,
"是否节假日":true
}https://www.xinyizhishu.top/yingdaoC/data_json.json
3. data_jsonW.json
{
"城市": "杭州",
"温度": 28.5,
"天气": "晴朗",
"预报": [
"多云",
"晴朗",
"雷阵雨"
],
"湿度": 60,
"风": {
"方向": "东南",
"速度": 10.5
},
"空气质量": null,
"是否节假日": true
}https://www.xinyizhishu.top/yingdaoC/data_jsonW.json
二、JSONPath
1.json基础操作
import json
data_json ='''{
"城市":"杭州",
"温度":28.5,
"天气":"晴朗",
"预报":["多云","晴朗","雷阵雨"],
"湿度":60,
"风":{"方向":"东南","速度":10.5},
"空气质量":null,
"是否节假日":true
}'''
data_python=json.loads(data_json)
print(data_python['预报'][1])https://www.xinyizhishu.top/yingdaoC/JSONPath.py
2.区划代码提取示例
先用千问生成一小部分数据:
{
"code": 1,
"msg": "数据返回成功!",
"data": [
{
"name": "中国",
"code": "1",
"clist": [
{
"code": "110000",
"name": "北京市",
"pchilds": [
{ "code": "110101", "name": "东城区" },
{ "code": "110102", "name": "西城区" },
{ "code": "110105", "name": "朝阳区" },
{ "code": "110106", "name": "丰台区" },
{ "code": "110107", "name": "石景山区" }
]
},
{
"code": "120000",
"name": "天津市",
"pchilds": [
{ "code": "120101", "name": "和平区" },
{ "code": "120102", "name": "河东区" },
{ "code": "120103", "name": "河西区" },
{ "code": "120104", "name": "南开区" },
{ "code": "120105", "name": "河北区" }
]
},
{
"code": "130000",
"name": "河北省",
"pchilds": [
{
"code": "130100",
"name": "石家庄市",
"cchilds": [
{ "code": "130102", "name": "长安区" },
{ "code": "130104", "name": "桥西区" },
{ "code": "130105", "name": "新华区" }
]
},
{
"code": "130200",
"name": "唐山市",
"cchilds": [
{ "code": "130202", "name": "路南区" },
{ "code": "130203", "name": "路北区" }
]
},
{
"code": "130600",
"name": "保定市",
"cchilds": [
{ "code": "130602", "name": "竞秀区" },
{ "code": "130606", "name": "满城区" }
]
}
]
},
{
"code": "140000",
"name": "山西省",
"pchilds": [
{
"code": "140100",
"name": "太原市",
"cchilds": [
{ "code": "140105", "name": "小店区" },
{ "code": "140106", "name": "迎泽区" },
{ "code": "140107", "name": "杏花岭区" }
]
},
{
"code": "140200",
"name": "大同市",
"cchilds": [
{ "code": "140212", "name": "新荣区" },
{ "code": "140213", "name": "平城区" }
]
}
]
},
{
"code": "150000",
"name": "内蒙古自治区",
"pchilds": [
{
"code": "150100",
"name": "呼和浩特市",
"cchilds": [
{ "code": "150102", "name": "新城区" },
{ "code": "150103", "name": "回民区" },
{ "code": "150104", "name": "玉泉区" }
]
},
{
"code": "150200",
"name": "包头市",
"cchilds": [
{ "code": "150202", "name": "东河区" },
{ "code": "150203", "name": "昆都仑区" }
]
}
]
}
]
}
]
}一点一点筛选:
模糊筛选:
3. 实例
实例json数据:
{
"code": 200,
"data": {
"state": "0",
"info": [
{
"time": "2019-09-27",
"city": "那曲市",
"content": "[那曲市]到达【那曲邮政处理中心】"
},
{
"time": "2019-09-27",
"city": "拉萨市",
"content": "[拉萨市]离开【拉萨邮区中心局邮件处理中心】"
},
{
"time": "2019-09-26",
"city": "拉萨市",
"content": "[拉萨市]到达【航空邮件处理中心】(经转)"
},
{
"time": "2019-09-25",
"city": "北京市",
"content": "[北京市]离开【北京航站】"
}
]
},
"Author": {
"name": "Alone88",
"desc": "由Alone88提供的免费API 服务,官方文档:www.alapi.cn"
}
}提取data节点:
info节点:
提取content得用2个点:
或者加*号:
提取其中一个:
用,隔开表示取其中几个:
冒号不包括后面的:
加上中括号效果一样:
还可以把.去掉:
@.length,加括号:
高级表达式:
与或非:
4.在python中运用:
安装库:
pip install jsonpath
代码:
from jsonpath import jsonpath
data_json2 ='''{
"code": 200,
"data": {
"state": "0",
"info": [
{
"time": "2019-09-27",
"city": "那曲市",
"content": "[那曲市]到达【那曲邮政处理中心】"
},
{
"time": "2019-09-27",
"city": "拉萨市",
"content": "[拉萨市]离开【拉萨邮区中心局邮件处理中心】"
},
{
"time": "2019-09-26",
"city": "拉萨市",
"content": "[拉萨市]到达【航空邮件处理中心】(经转)"
},
{
"time": "2019-09-25",
"city": "北京市",
"content": "[北京市]离开【北京航站】"
}
]
},
"Author": {
"name": "Alone88",
"desc": "由Alone88提供的免费API 服务,官方文档:www.alapi.cn"
}
}'''
data_python2=json.loads(data_json2)
result=jsonpath(data_python2,"$..content")
print(result)文件写到一块了:
https://www.xinyizhishu.top/yingdaoC/JSONPath.py
三、JSON案例
1. 请求地址
https://www.mxnzp.com/doc/detail?id=8
https://www.mxnzp.com/api/address/v2/list?app_id=不再提供请自主申请&app_secret=不再提供请自主申请
id需登录获取。
2.先提取两列:
影刀自带:
导入代码块:
代码块:
from jsonpath import jsonpath name=jsonpath(json_instance,'$.data[0].clist[*].pchilds[*].cchilds[*].name') code=jsonpath(json_instance,'$.data[0].clist[*].pchilds[*].cchilds[*].code')
写入数据表格:
2.提取省市:
jsonpath不适用。
数据表格:
3.用pandas
pandas代码:
import pandas as pd dataframe = pd.json_normalize( json_instance['data'][0], ['clist', 'pchilds', 'cchilds'], [['clist', 'name'], ['clist', 'pchilds', 'name']] ) cchilds_list = dataframe.reindex(columns=['clist.name', 'clist.pchilds.name', 'name', 'code']).values.tolist()



















