使用python如何提取JSON數(shù)據(jù)指定內(nèi)容
如何提取JSON數(shù)據(jù)指定內(nèi)容
假設(shè)我們要獲取'pic_str'里的數(shù)據(jù)
JSON數(shù)據(jù)
{'err_no': 0, 'err_str': 'OK', 'pic_id': '1169213517976400008', 'pic_str': 'xoet', 'md5': 'ca9bc4fda521498d2b3aba5dbb4ee4ac'}1、JSON數(shù)據(jù)為字符串類(lèi)型
import json
?
str = "{'err_no': 0, 'err_str': 'OK', 'pic_id': '1169213517976400008', 'pic_str': 'xoet', 'md5': 'ca9bc4fda521498d2b3aba5dbb4ee4ac'}"
json_str = str.replace("'",'"')
# json.loads() ,要求json串格式中必須的雙引號(hào)??!轉(zhuǎn)換為字典
json_dict = json.loads(dict2)
print(json_dict['pic_str'])
>> xoet2、JSON數(shù)據(jù)為字典類(lèi)型
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)如何提取復(fù)雜JSON的數(shù)據(jù)
在越來(lái)越多的項(xiàng)目中,基本都用了 json 作為接口數(shù)據(jù)返回的格式。json 給我們的感覺(jué)就是通俗易懂,只是即使再?gòu)?fù)雜的結(jié)構(gòu)也會(huì)比其他格式容易看。然而一旦在調(diào)試或者測(cè)試中需要用到提取某一部分字段數(shù)據(jù)進(jìn)行解析并校驗(yàn)的話(huà),就沒(méi)那么容易了。這篇文章使用 python 簡(jiǎn)單地獲取到復(fù)雜 json 數(shù)據(jù)中的字段信息。
例子
如果有一個(gè)接口返回的 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"
? ? ? ]
? ? }
? ]
}這里就包含了對(duì)象,以及列表數(shù)據(jù)。對(duì)象中也包含列表數(shù)據(jù)。這應(yīng)該是最基本的企業(yè)接口 json 格式了。
假如你要提取 json 中的 name 信息,最簡(jiǎn)單的方式就是
member = [ members.get('name') for members in data.get('familyMembers') ]如果是要連續(xù)拿其他的信息,那么就需要換其他中獲取方式,其實(shí)這種是比較麻煩的一種方法。
解決方法
extract_element_from_json(data, ["familyMembers", "name"]) >> ['Jobs', 'James']
此函數(shù)根據(jù) path 中指定的鍵嵌套到obj中的記錄中以檢索所需的信息。當(dāng)遇到一個(gè)列表作為 path 中鍵的值時(shí),此函數(shù)會(huì)拆分并以深度優(yōu)先的方式繼續(xù)嵌套在遇到的列表的每個(gè)元素上。這就是返回 ['Jobs', 'James'] 的方式;因?yàn)?familyMembers 的值是一個(gè)列表,所以嵌套在它的兩個(gè)元素上被拆分,并且 name 的每個(gè)值都附加到輸出列表中。
如果 obj 是單個(gè)字典/ json,則此函數(shù)返回包含所需信息的列表,如果 obj 是字典/ json 列表,則此函數(shù)返回包含所需信息的雙重列表。
如果嵌套字典/ json 的相應(yīng)級(jí)別缺少 path 的元素,則此函數(shù)返回 [None]。
完整代碼如下:
def extract_element_from_json(obj, path):
'''
輸入關(guān)鍵字,就可以將關(guān)鍵字的值信息存放在列表中并輸出
如果關(guān)鍵字是對(duì)象名,則返回的對(duì)象字典信息到列表中
如果關(guān)鍵字是列表名,則返回的列表信息到列表中(返回雙重列表)
'''
def extract(obj, path, ind, arr):
'''
從一個(gè)嵌套的字典中提取一個(gè)元素,并返回到列表中。
params: obj - dict - 輸入字典
params: path - list - 構(gòu)成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
這段代碼可以直接復(fù)制使用。
其中使用方法很簡(jiǎn)單如下:
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"])就是這么簡(jiǎn)單地使用了。
應(yīng)用場(chǎng)景
通過(guò)這樣的方式可以在什么場(chǎng)景下使用呢?
- 接口重構(gòu),需要校驗(yàn)接口中的部分字段數(shù)據(jù)
- 接口新增字段,只針對(duì)新增的字段進(jìn)行提取校驗(yàn)
- 需要提取某一部分字段進(jìn)行數(shù)據(jù)傳遞
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 尋找局部最高點(diǎn)的實(shí)現(xiàn)
今天小編就為大家分享一篇Python 尋找局部最高點(diǎn)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
詳解如何使用Python和正則表達(dá)式處理XML表單數(shù)據(jù)
在日常的Web開(kāi)發(fā)中,處理表單數(shù)據(jù)是一個(gè)常見(jiàn)的任務(wù),而XML是一種常用的數(shù)據(jù)格式,用于在不同的系統(tǒng)之間傳遞和存儲(chǔ)數(shù)據(jù),本文通過(guò)闡述一個(gè)技術(shù)問(wèn)題并給出解答的方式,介紹如何使用Python和正則表達(dá)式處理XML表單數(shù)據(jù),需要的朋友可以參考下2023-09-09
python讀取二進(jìn)制mnist實(shí)例詳解
這篇文章主要介紹了python讀取二進(jìn)制mnist實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
opencv深入淺出了解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)
機(jī)器學(xué)習(xí)是人工智能的核心,專(zhuān)門(mén)研究如何讓計(jì)算機(jī)模擬和學(xué)習(xí)人類(lèi)的行為。?深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中的一個(gè)熱門(mén)研究方向,它主要研究樣本數(shù)據(jù)的內(nèi)在規(guī)律和表示層次,讓計(jì)算機(jī)能夠讓人一樣具有分析與學(xué)習(xí)能力2022-03-03
在Django admin中編輯ManyToManyField的實(shí)現(xiàn)方法
今天小編就為大家分享一篇在Django admin中編輯ManyToManyField的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
YOLOv5車(chē)牌識(shí)別實(shí)戰(zhàn)教程(四)模型優(yōu)化與部署
這篇文章主要介紹了YOLOv5車(chē)牌識(shí)別實(shí)戰(zhàn)教程(四)模型優(yōu)化與部署,在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車(chē)牌識(shí)別,幫助你快速掌握YOLOv5車(chē)牌識(shí)別技能,需要的朋友可以參考下2023-04-04
Python 爬蟲(chóng)之超鏈接 url中含有中文出錯(cuò)及解決辦法
這篇文章主要介紹了Python 爬蟲(chóng)之超鏈接 url中含有中文出錯(cuò)及解決辦法的相關(guān)資料,出現(xiàn)UnicodeEncodeError: 'ascii' codec can't encode characters,的錯(cuò)誤解決辦法,需要的朋友可以參考下2017-08-08

