栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

JSON数据解析_json解析报错?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JSON数据解析_json解析报错?

一.用json包 ----解析只有一层对象和数组的结构 

1.用requests包和json包处理   import json(json包:用于实现Python数据类型与json字符串之间的转换)可取响应正文体的任意字段的value;适用于进行数据交互的场景,比如网站前台与后台之间的数据交互;

扩展:序列化和反序列化
序列化:給服务器发送一个请求的时候, 把Python对象转换成JSON字符串发給服务器的过程; 反序列化:拿到服务器的响应时候,把JSON字符串转换成python对象;

import requests
import json
res = requests.post(url='http://123.56.99.53:5000/event/weather/getWeather/',
              headers={"Content-Type": "application/json"},
              json={"theCityCode": "1001"})
print(res.text)
print(res.json()['date'])

requests    -----自带功能,序列化 将字典转换成字符串
res.json()  -----反序列化 将字符串转为字典,可通过字典取值

2.  用python自带的函数处理

# ~~ json.dumps()函数 序列化;是将字典转化为字符串; 即dict--->str
import json
a = {"name": "admin"}
print(json.dumps(a))
print(type(json.dumps(a)))
# ~~ json.loads()函数 反序列化;是将字符串转化为字典; str--->dict
import json
a1 = '{"name": "admin"}'
print(json.loads(a1))

print(type(json.loads(a1)))

练习:登录后取类型为户外

import json
session = requests.session()
res1 = session.post(url='http://....../event/api/admin/',
             headers={"Content-Type": "application/x-www-form-urlencoded"},
             data={"username": "admin", "password": "MTIzYWRtaW4="})
key = res1.json()['token']
uid = res1.json()['uid']  # uid = json.loads(res1.text)['uid']
# print(key)
# print(uid)
res2 = session.get(url='http://123.56.99.53:9000/event/api/get_eventlist/',
                   params={"type": "户外"},
                   headers={"key": key, "uid": uid})
# print(json.loads(res2.text))
for d in res2.json()['event_list']:
    print(d['type'])

注:resqusts.json()['key'] 等同于 json.loads(resqusts.text)['key'],都是反序列化,用法不一样

二. 使用 jsonpath 解析  jsonpath. jsonpath(字典)

JsonPath是一个数据提取工具,用于多层嵌套 json格式的 解析;
安装jsonpath 包的3种方法 ①pip install jsonpath ② 在pycharm setting 中找到项目解释器,搜索该包并安装 ③在控制台点击Terminal输入命令并安装
注:安装后输入 import jsonpath 看是否可成功引用; 可用json.loads()or res.json将字符串转成字典; 

/A/B A下面一级子节点B
/A//B A下面的所有递归路径下的B
$A.B A下面一级子节点B
$A..B  A下面的所有递归路径下的B
$..B  所有递归路径下的B
json 必须用双引号 字典单双都可
import jsonpath
r = jsonpath.jsonpath(data, expr='$.store.book[0].title')
print(r)
# #找到一个元素 返回一个列表,里面只有一项;
r = jsonpath.jsonpath(data, expr='$.store.book[?(@.isbn)].title')
print(r)
# 找到多个元素,返回列表(多项)
#没找到元素,返回 False
1.测接口,2.拿响应,3.响应转字典,4.用jsonpath解析,拿字段
res = requests.get(url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5')
data = res.json()['data']
data = json.loads(data)
childrens = jsonpath.jsonpath(data, '$.areaTree[0].children')
for ch in childrens[0]:
    name = ch['name']
    confirm = ch['today']['/confirm/i']
    if confirm > 0:
        print(f"{name}: {/confirm/i}")
        for ch2 in ch['children']:
            if ch2['today']['/confirm/i']>0:
                print(f" {ch2['name']}:{ch2['today']['/confirm/i']}")
三. 爬虫 多个json爬取
url = 'http://123.56....et_data/'
res = requests.get(url=url, params={"page": 1, "limit": 10})
count = res.json().get("count",0)
limit = 10
if count % limit ==0:
    max_page = count / limit
else:
    max_page = int(count/limit)+1
for i in range(1, max_page+1):
     res = requests.get(url=url, params={"page": i, "limit": 10})
     # print(res.json()['data'])
     for d in res.json()['data']:
         if d['username'] == 'test':
             print(d['oid'])
 

注:可用此网站辅助查看json正文的层级结构&校验json格式: JSON在线解析及格式化验证 - JSON.cn

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786713.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号