Python 中讀取和寫(xiě)入 JSON---轉(zhuǎn)

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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末师幕,一起剝皮案震驚了整個(gè)濱河市粟按,隨后出現(xiàn)的幾起案子诬滩,更是在濱河造成了極大的恐慌,老刑警劉巖灭将,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疼鸟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庙曙,警方通過(guò)查閱死者的電腦和手機(jī)空镜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捌朴,“玉大人吴攒,你說(shuō)我怎么就攤上這事∩氨危” “怎么了舶斧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)察皇。 經(jīng)常有香客問(wèn)我茴厉,道長(zhǎng),這世上最難降的妖魔是什么什荣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任矾缓,我火速辦了婚禮,結(jié)果婚禮上稻爬,老公的妹妹穿的比我還像新娘嗜闻。我一直安慰自己,他們只是感情好桅锄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布琉雳。 她就那樣靜靜地躺著,像睡著了一般友瘤。 火紅的嫁衣襯著肌膚如雪翠肘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天辫秧,我揣著相機(jī)與錄音束倍,去河邊找鬼。 笑死盟戏,一個(gè)胖子當(dāng)著我的面吹牛绪妹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柿究,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼邮旷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蝇摸?” 一聲冷哼從身側(cè)響起婶肩,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤办陷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狡孔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體懂诗,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年苗膝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殃恒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辱揭,死狀恐怖离唐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情问窃,我是刑警寧澤亥鬓,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站域庇,受9級(jí)特大地震影響嵌戈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜听皿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一熟呛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尉姨,春花似錦庵朝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至覆致,卻和暖如春侄旬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篷朵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工勾怒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人声旺。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像段只,于是被迫代替她去往敵國(guó)和親腮猖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容