使用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ù)為字符串類型
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']) >> xoet
2、JSON數(shù)據(jù)為字典類型
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)的話,就沒(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è)參考,也希望大家多多支持腳本之家。
- Python存儲(chǔ)json數(shù)據(jù)發(fā)生亂碼的解決方法
- Python實(shí)現(xiàn)提取JSON文件中指定數(shù)據(jù)并保存至CSV或Excel內(nèi)
- 執(zhí)行python腳本并傳入json數(shù)據(jù)格式參數(shù)方式
- Python中使用json.load()和json.loads()加載json數(shù)據(jù)的方法實(shí)例
- Python解析JSON數(shù)據(jù)的基本方法實(shí)例代碼
- 詳解Python中如何將數(shù)據(jù)存儲(chǔ)為json格式的文件
- python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)
- Python?JSON數(shù)據(jù)解析過(guò)程(最新推薦)
相關(guān)文章
Python 多進(jìn)程原理及實(shí)現(xiàn)
這篇文章主要介紹了Python 多進(jìn)程原理及實(shí)現(xiàn),幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12python通過(guò)txt文件批量安裝依賴包的實(shí)現(xiàn)步驟
今天小編就為大家分享一篇python通過(guò)txt文件批量安裝依賴包的實(shí)現(xiàn)步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python中Event實(shí)現(xiàn)線程間同步介紹
這篇文章主要介紹了python中Event實(shí)現(xiàn)線程間同步,Event是python線程間同步一種常用的方法,下列內(nèi)容總結(jié)需要的朋友可以參考一下2022-04-04Python一直報(bào)錯(cuò)SyntaxError:invalid?syntax的解決辦法
SyntaxError: invalid syntax 這個(gè)報(bào)錯(cuò)經(jīng)常遇見(jiàn),但是總感覺(jué)自己的代碼沒(méi)有問(wèn)題,根據(jù)報(bào)錯(cuò)提示的行也找不到錯(cuò)誤,這些情況以及解決方法都有哪些呢?這篇文章主要給大家介紹了關(guān)于Python一直報(bào)錯(cuò)SyntaxError:invalid?syntax的解決辦法,需要的朋友可以參考下2022-09-09Python時(shí)間序列處理之ARIMA模型的使用講解
今天小編就為大家分享一篇關(guān)于Python時(shí)間序列處理之ARIMA模型的使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04python破解WiFi教程代碼,Python蹭網(wǎng)原理講解
用Python生成一個(gè)簡(jiǎn)單的密碼本,一般是有數(shù)字、字母和符號(hào)組成,這里用到的思路主要是窮舉法。通過(guò)使用pywifi?模塊,根據(jù)密碼本暴力破解WiFi。本文只是從技術(shù)的角度來(lái)闡述學(xué)習(xí)Pywifi庫(kù)!并不建議大家做任何破壞性的操作和任何不當(dāng)?shù)男袨椋?/div> 2023-01-01python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例,需要的朋友可以參考下2014-04-04Django 路由層URLconf的實(shí)現(xiàn)
這篇文章主要介紹了Django 路由層URLconf的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12最新評(píng)論