使用python如何提取JSON数据指定内容
作者:hrflex 发布时间:2022-08-06 23:48:41
如何提取JSON数据指定内容
假设我们要获取'pic_str'里的数据
JSON数据
{'err_no': 0, 'err_str': 'OK', 'pic_id': '1169213517976400008', 'pic_str': 'xoet', 'md5': 'ca9bc4fda521498d2b3aba5dbb4ee4ac'}
1、JSON数据为字符串类型
import json
str = "{'err_no': 0, 'err_str': 'OK', 'pic_id': '1169213517976400008', 'pic_str': 'xoet', 'md5': 'ca9bc4fda521498d2b3aba5dbb4ee4ac'}"
json_str = str.replace("'",'"')
# json.loads() ,要求json串格式中必须的双引号!!转换为字典
json_dict = json.loads(dict2)
print(json_dict['pic_str'])
>> xoet
2、JSON数据为字典类型
import json
json_dict = {'err_no': 0,'err_str': 'OK', 'pic_id': '1169213517976400008', 'pic_str': 'xoet', 'md5': 'ca9bc4fda521498d2b3aba5dbb4ee4ac'}
# 方法一
print(json_dict['pic_str'])
# 或者使用 print(json_dict.get('pic_str'))
# 方法二:遍历
for pic in json_dict['pic_str'}:
print(pic)
如何提取复杂JSON的数据
在越来越多的项目中,基本都用了 json 作为接口数据返回的格式。json 给我们的感觉就是通俗易懂,只是即使再复杂的结构也会比其他格式容易看。然而一旦在调试或者测试中需要用到提取某一部分字段数据进行解析并校验的话,就没那么容易了。这篇文章使用 python 简单地获取到复杂 json 数据中的字段信息。
例子
如果有一个接口返回的 json 信息如下:
{
"familyName": "thinker family",
"homeTown": "广东省",
"formed": 2016,
"secretBase": "Super city",
"active": true,
"familyMembers": [
{
"name": "Jobs",
"age": 35,
"secretIdentity": "1992238132345",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "James",
"age": 37,
"secretIdentity": "8839394098124",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
}
]
}
这里就包含了对象,以及列表数据。对象中也包含列表数据。这应该是最基本的企业接口 json 格式了。
假如你要提取 json 中的 name 信息,最简单的方式就是
member = [ members.get('name') for members in data.get('familyMembers') ]
如果是要连续拿其他的信息,那么就需要换其他中获取方式,其实这种是比较麻烦的一种方法。
解决方法
extract_element_from_json(data, ["familyMembers", "name"])
>> ['Jobs', 'James']
此函数根据 path 中指定的键嵌套到obj中的记录中以检索所需的信息。当遇到一个列表作为 path 中键的值时,此函数会拆分并以深度优先的方式继续嵌套在遇到的列表的每个元素上。这就是返回 ['Jobs', 'James'] 的方式;因为 familyMembers 的值是一个列表,所以嵌套在它的两个元素上被拆分,并且 name 的每个值都附加到输出列表中。
如果 obj 是单个字典/ json,则此函数返回包含所需信息的列表,如果 obj 是字典/ json 列表,则此函数返回包含所需信息的双重列表。
如果嵌套字典/ json 的相应级别缺少 path 的元素,则此函数返回 [None]。
完整代码如下:
def extract_element_from_json(obj, path):
'''
输入关键字,就可以将关键字的值信息存放在列表中并输出
如果关键字是对象名,则返回的对象字典信息到列表中
如果关键字是列表名,则返回的列表信息到列表中(返回双重列表)
'''
def extract(obj, path, ind, arr):
'''
从一个嵌套的字典中提取一个元素,并返回到列表中。
params: obj - dict - 输入字典
params: path - list - 构成JSON路径的字符串列表
params: ind - int - 起始索引
params: arr - 列表 - 输出列表
'''
key = path[ind]
if ind + 1 < len(path):
if isinstance(obj, dict):
if key in obj.keys():
extract(obj.get(key), path, ind + 1, arr)
else:
arr.append(None)
elif isinstance(obj, list):
if not obj:
arr.append(None)
else:
for item in obj:
extract(item, path, ind, arr)
else:
arr.append(None)
if ind + 1 == len(path):
if isinstance(obj, list):
if not obj:
arr.append(None)
else:
for item in obj:
arr.append(item.get(key, None))
elif isinstance(obj, dict):
arr.append(obj.get(key, None))
else:
arr.append(None)
return arr
if isinstance(obj, dict):
return extract(obj, path, 0, [])
elif isinstance(obj, list):
outer_arr = []
for item in obj:
outer_arr.append(extract(item, path, 0, []))
return outer_arr
这段代码可以直接复制使用。
其中使用方法很简单如下:
extract_element_from_json(data, ["familyMembers", "name"])
api 提取元素
import requests
url = "http://ip-api.com/json"
response = requests.request("GET", url)
data = response.json()
extract_element_from_json(data, ["status"])
就是这么简单地使用了。
应用场景
通过这样的方式可以在什么场景下使用呢?
接口重构,需要校验接口中的部分字段数据
接口新增字段,只针对新增的字段进行提取校验
需要提取某一部分字段进行数据传递
来源:https://blog.csdn.net/qq_61177928/article/details/123030252


猜你喜欢
- 接触pandas之后感觉它的很多功能似乎跟numpy有一定的重复,尤其是各种运算。不过,简单的了解之后发现在数据管理上pandas有着更为丰
- 在我们开始之前,一定要注意这篇文章只针对Windows用户!对于那些使用Windows的人来说,这是一个有趣的想法。如果您想使用python
- 本文实例讲述了Python开发中爬虫使用代理proxy抓取网页的方法。分享给大家供大家参考,具体如下:代理类型(proxy):透明代理 匿名
- 冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉。实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移
- 前言:牛奶冻曲线(blancmange curve),因在1901年由高木贞治所研究,又称高木曲线。在单位区间内,牛奶冻函数定义为:分形曲线
- 报错信息最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序。在程序开发结束开始打包时,却发现一直报错PyIn
- Android客户端和PHP、MySQL搭建的服务器之间的简单交互,实现登录功能 。实现原理图:Handler消息机制原理:Handler机
- 人生苦短,快学Python!最近有位读者朋友遇到了一个小问题,私聊找小五答疑。感觉也会有其他同学会遇到,所以干脆分享出来。如下图所示,在本地
- Python 相对路径和绝对路径当你想在自己的某个python工程里使用相对路径时:1. 查看自己的当前所处文件夹的绝对路径:import
- 经常由于各种压缩格式的不一样用到文件的解压缩时就需要下载不同的解压缩工具去处理不同的文件,以至于桌面上的压缩工具就有三四种,于是使用pyth
- 听说pytorch使用比TensorFlow简单,加之pytorch现已支持windows,所以今天装了pytorch玩玩,第一件事还是写了
- 一、前言:在经过一段时间的存储过程开发之后,写下了一些开发时候的小结和经验与大家共享,希望对大家有益,主要是针对Sybase和SQL Ser
- [Hack] 意为”劈”、”砍”。 [Hacker] 意为”黑客”CSS Hack 是指针对不同的浏览器写不同的CSS code的过程,简单
- 近日在月影的blog上找到一段代码。看了老半天没明白什么意思,倍受打击!不死心,于是仔细分析思考了好几次,才明白过来这段函数的意义。js果然
- 本文实例讲述了Python enumerate函数功能与用法。分享给大家供大家参考,具体如下:eunmerate在英文中是列举、枚举的意思,
- 1、引言小丝:鱼哥,2023年了, 你有啥愿望啊?小鱼:这, 我可以选择不告诉你吗?小丝:可以选择不告诉我,但是,你自己憋着,不难受吗?小鱼
- python实现PSO算法优化二元函数,具体代码如下所示:import numpy as np import random import m
- 1、异常出现的场景.:在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中
- 前言最近需要通过python来获取cad模型的内容信息,然而笔者也没学过python,只能用过查询+动手摸索一步一步进行下去,然后通过dxf
- java 中JDBC连接数据库代码和步骤详解JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: