溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用python提取JSON數(shù)據(jù)指定內(nèi)容

發(fā)布時間:2022-07-07 10:00:20 來源:億速云 閱讀:675 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么使用python提取JSON數(shù)據(jù)指定內(nèi)容”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

python提取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串格式中必須的雙引號??!轉(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)

python提取復(fù)雜JSON的數(shù)據(jù) 

在越來越多的項目中,基本都用了 json 作為接口數(shù)據(jù)返回的格式。json 給我們的感覺就是通俗易懂,只是即使再復(fù)雜的結(jié)構(gòu)也會比其他格式容易看。然而一旦在調(diào)試或者測試中需要用到提取某一部分字段數(shù)據(jù)進行解析并校驗的話,就沒那么容易了。這篇文章使用 python 簡單地獲取到復(fù)雜 json 數(shù)據(jù)中的字段信息。

例子

如果有一個接口返回的 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"
      ]
    }
  ]
}

這里就包含了對象,以及列表數(shù)據(jù)。對象中也包含列表數(shù)據(jù)。這應(yīng)該是最基本的企業(yè)接口 json 格式了。

假如你要提取 json 中的 name 信息,最簡單的方式就是

member = [ members.get('name') for members in data.get('familyMembers') ]

如果是要連續(xù)拿其他的信息,那么就需要換其他中獲取方式,其實這種是比較麻煩的一種方法。

解決方法

extract_element_from_json(data, ["familyMembers", "name"])
>> ['Jobs', 'James']

此函數(shù)根據(jù) path 中指定的鍵嵌套到obj中的記錄中以檢索所需的信息。當(dāng)遇到一個列表作為 path 中鍵的值時,此函數(shù)會拆分并以深度優(yōu)先的方式繼續(xù)嵌套在遇到的列表的每個元素上。這就是返回 ['Jobs', 'James'] 的方式;因為 familyMembers 的值是一個列表,所以嵌套在它的兩個元素上被拆分,并且 name 的每個值都附加到輸出列表中。

如果 obj 是單個字典/ json,則此函數(shù)返回包含所需信息的列表,如果 obj 是字典/ json 列表,則此函數(shù)返回包含所需信息的雙重列表。

如果嵌套字典/ json 的相應(yīng)級別缺少 path 的元素,則此函數(shù)返回 [None]。

完整代碼如下: 

def extract_element_from_json(obj, path):
    '''
    輸入關(guān)鍵字,就可以將關(guān)鍵字的值信息存放在列表中并輸出
    如果關(guān)鍵字是對象名,則返回的對象字典信息到列表中
    如果關(guān)鍵字是列表名,則返回的列表信息到列表中(返回雙重列表)
    '''
    def extract(obj, path, ind, arr):
    	'''
    	從一個嵌套的字典中提取一個元素,并返回到列表中。
        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ù)制使用。

其中使用方法很簡單如下:

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"])

就是這么簡單地使用了。

應(yīng)用場景

通過這樣的方式可以在什么場景下使用呢?

  • 接口重構(gòu),需要校驗接口中的部分字段數(shù)據(jù)

  • 接口新增字段,只針對新增的字段進行提取校驗

  • 需要提取某一部分字段進行數(shù)據(jù)傳遞

“怎么使用python提取JSON數(shù)據(jù)指定內(nèi)容”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI