JSON(JavaScript Object Notation)是一種常用于數(shù)據(jù)交換的輕量級(jí)數(shù)據(jù)格式。它易于閱讀和編寫(xiě)茁影,同時(shí)也易于機(jī)器解析和生成宙帝。在 Python 中,可以使用內(nèi)置的?json?模塊來(lái)處理 JSON 數(shù)據(jù)募闲。本文將詳細(xì)介紹如何在 Python 中讀取和寫(xiě)入 JSON 數(shù)據(jù)步脓,以及如何處理復(fù)雜的 JSON 結(jié)構(gòu)。
更多Python學(xué)習(xí)內(nèi)容:http://ipengtao.com
什么是 JSON?
JSON 是一種用于表示數(shù)據(jù)的文本格式靴患,通常以鍵值對(duì)的形式表示數(shù)據(jù)項(xiàng)仍侥。JSON 數(shù)據(jù)是純文本,可以輕松在不同編程語(yǔ)言之間進(jìn)行交換和解析鸳君。
JSON 由以下基本數(shù)據(jù)類(lèi)型組成:
對(duì)象(Object):由一對(duì)大括號(hào)?{}?包圍的無(wú)序鍵值對(duì)访圃,鍵和值之間用冒號(hào)?:?分隔,多個(gè)鍵值對(duì)之間用逗號(hào)?,?分隔相嵌。鍵必須是字符串腿时,值可以是字符串、數(shù)字饭宾、布爾值批糟、數(shù)組、對(duì)象或?null看铆。
數(shù)組(Array):由一對(duì)中括號(hào)?[]?包圍的有序值的集合徽鼎,多個(gè)值之間用逗號(hào)?,?分隔。值可以是字符串弹惦、數(shù)字否淤、布爾值、數(shù)組棠隐、對(duì)象或?null石抡。
字符串(String):由雙引號(hào)?"?包圍的字符序列。
數(shù)字(Number):整數(shù)或浮點(diǎn)數(shù)助泽。
布爾值(Boolean):true?或?false啰扛。
空值(null):表示空值。
以下是一個(gè)簡(jiǎn)單的 JSON 示例:
{
? "name": "Alice",
? "age": 30,
? "is_student": false,
? "grades": [85, 92, 78],
? "address": {
? ? "street": "123 Main St",
? ? "city": "New York"
? }
}
讀取 JSON 數(shù)據(jù)
在 Python 中讀取 JSON 數(shù)據(jù)非常簡(jiǎn)單嗡贺,可以使用?json?模塊中的?load()?或?loads()?函數(shù)來(lái)實(shí)現(xiàn)隐解。load()?用于從文件中讀取 JSON 數(shù)據(jù),而?loads()?用于從字符串中讀取 JSON 數(shù)據(jù)诫睬。
從文件讀取 JSON 數(shù)據(jù)
假設(shè)有一個(gè)名為?data.json?的 JSON 文件煞茫,包含以下內(nèi)容:
{
? "name": "Alice",
? "age": 30,
? "is_student": false,
? "grades": [85, 92, 78],
? "address": {
? ? "street": "123 Main St",
? ? "city": "New York"
? }
}
可以使用?json.load()?函數(shù)來(lái)讀取該文件:
import json
# 打開(kāi) JSON 文件
with open('data.json', 'r') as file:
? ? data = json.load(file)
# 打印讀取的 JSON 數(shù)據(jù)
print(data)
運(yùn)行上述代碼后,將輸出以下結(jié)果:
{
? "name": "Alice",
? "age": 30,
? "is_student": false,
? "grades": [85, 92, 78],
? "address": {
? ? "street": "123 Main St",
? ? "city": "New York"
? }
}
json.load()?函數(shù)將文件內(nèi)容解析為 Python 字典(或其他適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu))摄凡,以供進(jìn)一步處理续徽。
從字符串讀取 JSON 數(shù)據(jù)
如果 JSON 數(shù)據(jù)存儲(chǔ)在一個(gè)字符串中,可以使用?json.loads()?函數(shù)來(lái)解析它:
import json
# JSON 字符串
json_string = '{"name": "Alice", "age": 30, "is_student": false}'
# 解析 JSON 字符串
data = json.loads(json_string)
# 打印解析后的數(shù)據(jù)
print(data)
運(yùn)行上述代碼后架谎,將輸出以下結(jié)果:
{
? "name": "Alice",
? "age": 30,
? "is_student": false
}
json.loads()?函數(shù)將 JSON 字符串解析為 Python 字典炸宵。
寫(xiě)入 JSON 數(shù)據(jù)
與讀取 JSON 數(shù)據(jù)類(lèi)似,Python 中寫(xiě)入 JSON 數(shù)據(jù)也非常容易谷扣⊥寥可以使用?json?模塊中的?dump()?或?dumps()?函數(shù)來(lái)實(shí)現(xiàn)捎琐。dump()?用于將數(shù)據(jù)寫(xiě)入文件,而?dumps()?用于將數(shù)據(jù)轉(zhuǎn)換為 JSON 字符串裹匙。
寫(xiě)入 JSON 數(shù)據(jù)到文件
假設(shè)有一個(gè) Python 字典瑞凑,希望將其寫(xiě)入一個(gè)名為?output.json?的 JSON 文件中:
import json
# 要寫(xiě)入的數(shù)據(jù)
data = {
? ? "name": "Bob",
? ? "age": 25,
? ? "is_student": True
}
# 將數(shù)據(jù)寫(xiě)入 JSON 文件
with open('output.json', 'w') as file:
? ? json.dump(data, file)
運(yùn)行上述代碼后,將在當(dāng)前目錄下創(chuàng)建一個(gè)名為?output.json?的文件概页,其中包含寫(xiě)入的 JSON 數(shù)據(jù)籽御。
將數(shù)據(jù)轉(zhuǎn)換為 JSON 字符串
如果想要將數(shù)據(jù)轉(zhuǎn)換為 JSON 格式的字符串,可以使用?json.dumps()?函數(shù):
import json
# 要轉(zhuǎn)換的數(shù)據(jù)
data = {
? ? "name": "Charlie",
? ? "age": 35,
? ? "is_student": False
}
# 將數(shù)據(jù)轉(zhuǎn)換為 JSON 字符串
json_string = json.dumps(data)
# 打印 JSON 字符串
print(json_string)
運(yùn)行上述代碼后惰匙,將輸出以下結(jié)果:
{"name": "Charlie", "age": 35, "is_student": false}
json.dumps()?函數(shù)將 Python 字典轉(zhuǎn)換為 JSON 格式的字符串技掏。
處理復(fù)雜的 JSON 結(jié)構(gòu)
有時(shí),JSON 數(shù)據(jù)可能包含嵌套的對(duì)象和數(shù)組项鬼,處理這些復(fù)雜的結(jié)構(gòu)也很容易哑梳。可以使用遞歸來(lái)訪(fǎng)問(wèn)和修改 JSON 數(shù)據(jù)中的嵌套元素绘盟。
訪(fǎng)問(wèn)嵌套元素
假設(shè)有以下復(fù)雜的 JSON 數(shù)據(jù):
{
? "name": "David",
? "address": {
? ? "street": "456 Elm St",
? ? "city": "Los Angeles"
? },
? "friends": [
? ? {"name": "Ella", "age": 28},
? ? {"name": "Frank", "age": 32}
? ]
}
可以通過(guò)多層索引來(lái)訪(fǎng)問(wèn)嵌套的元素:
import json
# JSON 數(shù)據(jù)
json_data = {
? "name": "David",
? "address": {
? ? "street": "456 Elm St",
? ? "city": "Los Angeles"
? },
? "friends": [
? ? {"name": "Ella", "age": 28},
? ? {"name": "Frank", "age": 32}
? ]
}
# 訪(fǎng)問(wèn)嵌套元素
name = json_data["name"]
street = json_data["address"]["street"]
friend_name = json_data["friends"][0]["name"]
print("Name:", name)
print("Street:", street)
print("Friend's Name:", friend_name)
運(yùn)行上述代碼后鸠真,將輸出以下結(jié)果:
Name: David
Street: 456 Elm St
Friend's Name: Ella
修改嵌套元素
如果想要修改 JSON 數(shù)據(jù)中的某個(gè)嵌套元素,也可以輕松實(shí)現(xiàn)龄毡。
例如吠卷,可以修改上述 JSON 數(shù)據(jù)中 Ella 的年齡:
import json
# JSON 數(shù)據(jù)
json_data = {
? "name": "David",
? "address": {
? ? "street": "456 Elm St",
? ? "city": "Los Angeles"
? },
? "friends": [
? ? {"name": "Ella", "age": 28},
? ? {"name": "Frank", "age": 32}
? ]
}
# 修改嵌套元素
json_data["friends"][0]["age"] = 29
# 打印修改后的 JSON 數(shù)據(jù)
print(json_data)
運(yùn)行上述代碼后,將輸出以下結(jié)果:
{
? "name": "David",
? "address": {
? ? "street": "456 Elm St",
? ? "city": "Los Angeles"
? },
? "friends": [
? ? {"name": "Ella", "age": 29},
? ? {"name": "Frank", "age": 32}
? ]
}
處理異常
在讀取和解析 JSON 數(shù)據(jù)時(shí)沦零,有可能會(huì)出現(xiàn)異常祭隔。常見(jiàn)的異常包括?json.JSONDecodeError(解析錯(cuò)誤)和?FileNotFoundError(文件不存在)。為了確保代碼的穩(wěn)定性蠢终,應(yīng)該處理這些異常序攘。
下面是一個(gè)讀取 JSON 文件并處理異常的示例:
import json
try:
? ? with open('non_existent_file.json', 'r') as file:
? ? ? ? data = json.load(file)
except FileNotFoundError:
? ? print("File not found.")
except json.JSONDecodeError as e:
? ? print(f"JSON decode error: {e}")
在上述代碼中,首先嘗試打開(kāi)文件并讀取 JSON 數(shù)據(jù)寻拂。如果文件不存在,將捕獲?FileNotFoundError?異常并打印一條相應(yīng)的錯(cuò)誤消息丈牢。如果 JSON 數(shù)據(jù)解析出現(xiàn)問(wèn)題祭钉,將捕獲?json.JSONDecodeError?異常并打印解析錯(cuò)誤的詳細(xì)信息。
總結(jié)
Python 的?json?模塊提供了強(qiáng)大的功能己沛,用于讀取和寫(xiě)入 JSON 數(shù)據(jù)慌核。無(wú)論是處理簡(jiǎn)單的鍵值對(duì)還是復(fù)雜的嵌套結(jié)構(gòu),Python 都提供了方便的工具來(lái)處理 JSON 數(shù)據(jù)申尼。通過(guò)使用這些技巧垮卓,可以輕松地與其他應(yīng)用程序和服務(wù)進(jìn)行數(shù)據(jù)交互,從而更好地利用和分享數(shù)據(jù)