|
|
|
|
|
本文介紹如何使用 Python json.load()
和json.loads()
方法從文件和字符串讀取 JSON 數(shù)據(jù)。
使用json.load()
和json.loads()
方法,你可以將 JSON 編碼/格式化數(shù)據(jù)轉(zhuǎn)換為 Python 類型,此過程稱為 JSON 解碼。Python 內(nèi)置模塊 json 提供了以下兩種方法來解碼 JSON 數(shù)據(jù)。
使用load和loads解析Python JSON
要從 URL 或文件解析 JSON,請使用json.load()
,對于帶有 JSON 內(nèi)容的解析字符串,請使用json.loads()
。
json.load()和json.loads()的語法
我們可以使用load()
和loads()
方法進(jìn)行許多 JSON 解析操作。首先,了解它的語法和參數(shù),然后我們將一一介紹其用法。
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
所有參數(shù)在這兩種方法中都具有相同的含義。
使用的參數(shù):
json.load()
用于從文件中讀取 JSON 文檔, 而json.loads()
用于將 JSON String 文檔轉(zhuǎn)換為 Python 字典。load()
方法,這樣我們就可以獲得自定義的 Python 類型而不是字典。我們將詳細(xì)了解所有這些參數(shù)的使用。
json.load() 從文件中讀取 JSON 數(shù)據(jù)并將其轉(zhuǎn)換為字典
使用一種json.load()
方法,我們可以從文本、JSON或二進(jìn)制文件中讀取 JSON 數(shù)據(jù)。該json.load()
方法以 Python 字典的形式返回?cái)?shù)據(jù)。稍后我們使用這個(gè)字典來訪問和操作我們的應(yīng)用程序或系統(tǒng)中的數(shù)據(jù)。
請參考下面的轉(zhuǎn)換表,該表是json.load()
和json.loads()
方法在解碼時(shí)使用的轉(zhuǎn)換表。
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int & float-derived Enums | number |
True | true |
False | false |
None | null |
現(xiàn)在,讓我們看看這個(gè)例子。在這個(gè)例子中,我正在讀取我硬盤上的“ developer.json ”文件。此文件包含以下 JSON 數(shù)據(jù)。
{
"name": "Kaka",
"salary": 9000,
"skills": [
"Raspberry pi",
"Machine Learning",
"Web Development"
],
"email": "Kaka@webkaka.com",
"projects": [
"Python Data Mining",
"Python Data Science"
]
}
示例
import json
print("Started Reading JSON file")
with open("developer.json", "r") as read_file:
print("Converting JSON encoded data into Python dictionary")
developer = json.load(read_file)
print("Decoded JSON Data From File")
for key, value in developer.items():
print(key, ":", value)
print("Done reading json file")
輸出
Started Reading JSON file
Converting JSON encoded data into Python dictionary
Decoded JSON Data From File
name : kaka
salary : 9000
skills : ['Raspberry pi', 'Machine Learning', 'Web Development']
email : Kaka@webkaka.com
projects : ['Python Data Mining', 'Python Data Science']
Done reading json file
使用以下代碼如果要直接訪問 JSON 密鑰而不是從文件中迭代整個(gè) JSON。
import json
print("Started Reading JSON file")
with open("developer.json", "r") as read_file:
print("Converting JSON encoded data into Python dictionary")
developer = json.load(read_file)
print("Decoding JSON Data From File")
print("Printing JSON values using key")
print(developer["name"])
print(developer["salary"])
print(developer["skills"])
print(developer["email"])
print("Done reading json file")
輸出
Started Reading JSON file
Converting JSON encoded data into Python dictionary
Decoding JSON Data From File
Printing JSON values using key
kaka
9000
['Raspberry pi', 'Machine Learning', 'Web Development']
Kaka@webkaka.com
Done reading json file
你可以使用上述相同的方式從文本、json 或二進(jìn)制文件中讀取 JSON 數(shù)據(jù)。
json.loads() 將 JSON 字符串轉(zhuǎn)換為字典
有時(shí)我們會(huì)收到字符串格式的 JSON 響應(yīng)。因此,要在我們的應(yīng)用程序中使用它,我們需要將 JSON 字符串轉(zhuǎn)換為 Python 字典。使用該json.loads()
方法,我們可以將包含 JSON 文檔的原生 String、byte 或 bytearray 實(shí)例反序列化為 Python 字典。我們可以參考文章開頭提到的轉(zhuǎn)換表。
import json
developerJsonString = """{
"name": "kaka",
"salary": 9000,
"skills": [
"Raspberry pi",
"Machine Learning",
"Web Development"
],
"email": "kaka@webkaka.com",
"projects": [
"Python Data Mining",
"Python Data Science"
]
}
"""
print("Started converting JSON string document to Python dictionary")
developerDict = json.loads(developerJsonString)
print("Printing key and value")
print(developerDict["name"])
print(developerDict["salary"])
print(developerDict["skills"])
print(developerDict["email"])
print(developerDict["projects"])
print("Done converting JSON string document to a dictionary")
輸出
Started converting JSON string document to Python dictionary
Printing key and value
jane doe
9000
['Raspberry pi', 'Machine Learning', 'Web Development']
JaneDoe@pynative.com
['Python Data Mining', 'Python Data Science']
Done converting JSON string document to a dictionary
假設(shè)你有一個(gè)如下所示的 JSON 響應(yīng):
developerInfo = """{
"id": 23,
"name": "Kaka",
"salary": 9000,
"email": "kaka@webkaka.com",
"experience": {"python":5, "data Science":2},
"projectinfo": [{"id":100, "name":"Data Mining"}]
}
"""
例如,你想從開發(fā)人員信息 JSON 數(shù)組中檢索項(xiàng)目名稱,以了解他/她正在從事的項(xiàng)目。現(xiàn)在讓我們看看如何讀取嵌套的 JSON 數(shù)組鍵值。
在此示例中,我們使用了開發(fā)人員信息 JSON 數(shù)組,該數(shù)組具有作為嵌套 JSON 數(shù)據(jù)的項(xiàng)目信息和經(jīng)驗(yàn)。
import json
print("Started reading nested JSON array")
developerDict = json.loads(developerInfo)
print("Project name: ", developerDict["projectinfo"][0]["name"])
print("Experience: ", developerDict["experience"]["python"])
print("Done reading nested JSON Array")
輸出
Started reading nested JSON array
Project name: Data Mining
Experience: 5
Done reading nested JSON Array
OrderedDict 可以用作 JSON 的輸入。我的意思是,當(dāng)你將 JSON 轉(zhuǎn)儲(chǔ)到文件或字符串中時(shí),我們可以將 OrderedDict 傳遞給它。
但是,當(dāng)我們想要維護(hù)順序時(shí),我們將 JSON 數(shù)據(jù)加載回 OrderedDict 以便我們可以保持文件中鍵的順序。
現(xiàn)在讓我們看看例子。
import json
from collections import OrderedDict
print("Ordering keys")
OrderedData = json.loads('{"John":1, "Emma": 2, "Ault": 3, "Brian": 4}', object_pairs_hook=OrderedDict)
print("Type: ", type((OrderedData)))
print(OrderedData)
輸出
Ordering keys
Type: <class 'collections.OrderedDict'>
OrderedDict([('John', 1), ('Emma', 2), ('Ault', 3), ('Brian', 4)])
如何使用json.load()的parse_float和parse_int
正如我已經(jīng)說過的parse_float和parse_int,兩者都是可選參數(shù),但如果指定,將使用要解碼的每個(gè) JSON 浮點(diǎn)數(shù)和整數(shù)的字符串調(diào)用。默認(rèn)情況下,這等效于float(num_str)
和int(num_str)
。
假設(shè) JSON 文檔包含許多浮點(diǎn)值,并且你希望將所有浮點(diǎn)值四舍五入到兩位小數(shù)點(diǎn)。在這種情況下,我們需要定義一個(gè)自定義函數(shù)來執(zhí)行你想要的任何舍入。我們可以將這樣的函數(shù)傳遞給parse_float kwarg。
此外,如果你想對整數(shù)值執(zhí)行任何操作,我們可以編寫一個(gè)自定義函數(shù)并將其傳遞給parse_int kwarg。例如,你在 JSON 文檔中收到請假天數(shù),并且你想計(jì)算要扣除的工資。
例子
import json
def roundFloats(salary):
return round(float(salary), 2)
def salartToDeduct(leaveDays):
salaryPerDay = 465
return int(leaveDays) * salaryPerDay
print("Load float and int values from JSON and manipulate it")
print("Started Reading JSON file")
with open("developerDetails.json", "r") as read_file:
developer = json.load(read_file, parse_float=roundFloats,
parse_int=salartToDeduct)
# after parse_float
print("Salary: ", developer["salary"])
# after parse_int
print("Salary to deduct: ", developer["leavedays"])
print("Done reading a JSON file")
輸出
Load float and int values from JSON and manipulate it
Started Reading JSON file
Salary: 9250.542
<class 'float'>
Salary to deduct: 3
Done reading a JSON file
在load()方法中使用JSON解碼器
Python 的內(nèi)置 json 模塊只能處理具有直接 JSON 等效項(xiàng)的 Python 原語類型(例如,字典、列表、字符串、數(shù)字、None 等)。
當(dāng)你執(zhí)行json.load()
或 json.loads()
方法時(shí),它會(huì)返回一個(gè) Python 字典。如果你想 將 JSON 轉(zhuǎn)換為自定義 Python 對象,那么我們可以編寫一個(gè)自定義 JSON 解碼器并將其傳遞給該json.loads()
方法,這樣我們就可以獲得自定義 Class 對象而不是字典。
下面我們來看看如何在load()
方法中使用JSON解碼器。在這個(gè)例子中,我們將看到如何使用load()
方法的object_hook參數(shù)。
import json
from collections import namedtuple
from json import JSONEncoder
def movieJsonDecod(movieDict):
return namedtuple('X', movieDict.keys())(*movieDict.values())
# class for your reference
class Movie:
def __init__(self, name, year, income):
self.name = name
self.year = year
self.income = income
# Suppose you have this json document.
movieJson = """{
"name": "Interstellar",
"year": 2014,
"income": 7000000
}"""
# Parse JSON into an Movie object
movieObj = json.loads(movieJson, object_hook=movieJsonDecod)
print("After Converting JSON into Movie Object")
print(movieObj.name, movieObj.year, movieObj.income)
輸出
After Converting JSON into Movie Object
Interstellar 2014 7000000
總結(jié)
本文介紹了Python json.load()
和json.loads()
讀取JSON的區(qū)別。通過本文,你將學(xué)會(huì)如何使用 Python json.load()
和json.loads()
方法從文件和字符串讀取 JSON 數(shù)據(jù)。