使用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
猜你喜欢
- The WeekdayName function returns the weekday name of a specified day o
- 本文实例讲述了Python列表解析操作。分享给大家供大家参考,具体如下:列表解析Python 的强大特性之一是其对 list 的解析,它提供
- 概述要访问一个变量的内容,可以直接使用其名称。如果该变量是一个数组,可以使用变量名称和关键字或索引的组合来访问其内容。像其他变量一样,使用运
- 本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参考,具体内容如下今天读的代码,顺便写了出来,与文档的对比,差不多
- 抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负
- 本文列出了HTML4标签的默认样式列表,对网页设计者来说这个应该很有用。原文来自:W3C (http://www.w3.org/TR/CSS
- 需要准备环境:python3.6、vultr(或者其他服务器)、xshell第一步:python安装必备环境Django库Xshell链接远
- 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们
- 本文实例讲述了php实现图片转换成ASCII码的方法。分享给大家供大家参考。具体如下:php图片转换成ASCII码,转换后可以直接通过字符串
- 一、无组件上传的原理我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过<input type="
- 大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需要,在asp里需用到此方法,查了好多资料,没
- 安装pip install websocket-client先来看一下,长连接调用方式:ws = websocket.WebSocketAp
- 之前我们已经安装了lnmp的环境,现在让我们来安装phpmyadmin。跟前一样,yum默认的库里是没有phpmyadmin的,我们需要从e
- 基本信息程序包名称:基于.net开发的遵循web标准的个人站点程序包下载开发者主页:www.ceocio.net软件大小:1.84mb安装环
- 在ASP中,除了ADODB、Scripting 等一些常用组件外,我们还可以用微软的ActiveX方法来轻松捕获哟: <%u
- 引言我看到很多 golang 社区的开发者,特别是因为它的简单性而被吸引的开发者,对 golang 中的事情应该如何处理做出了一些快速的判断
- python 里面与时间有关的模块主要是 time 和 datetime如果想获取系统当前时间戳:time.time(),是一个float型
- 通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理,像这样:使用 grep/cut 方式:# 查看所有的集群,因
- 导入实验常用的python包。如图2所示。【import pandas as pd】pandas用来做数据处理。【import numpy
- 很多时候我们写的程序,会花上一分钟甚至几分钟时间。为了使软件使用者能够耐心的等待程序的执行,我们经常会希望有一个进度条来表示程序执行的状态。