python進(jìn)階之JSON數(shù)據(jù)解析完整示例
引言
在當(dāng)今數(shù)據(jù)驅(qū)動的世界中,JSON已成為數(shù)據(jù)交換的事實標(biāo)準(zhǔn)。無論是與 Web API 交互、配置應(yīng)用程序、存儲結(jié)構(gòu)化數(shù)據(jù),還是處理來自物聯(lián)網(wǎng)設(shè)備的數(shù)據(jù),幾乎不可避免地會遇到 JSON 格式。
一、JSON簡介
JSON(JavaScript Object Notation)是一種輕量級的、基于文本的數(shù)據(jù)交換格式。它被設(shè)計為易于人閱讀和編寫,同時也易于機(jī)器解析和生成,被廣泛應(yīng)用于各種編程語言和平臺之間。
JSON 數(shù)據(jù)由鍵值對組成,支持以下幾種基本數(shù)據(jù)類型:
- 對象 (Object): 用花括號
{}包圍,包含零個或多個鍵值對,鍵是字符串,值可以是任何有效的 JSON 數(shù)據(jù)類型。 - 數(shù)組 (Array): 用方括號
[]包圍,包含零個或多個值,值之間用逗號分隔。 - 字符串 (String): 用雙引號
""包圍的字符序列。 - 數(shù)字 (Number): 整數(shù)或浮點數(shù)。
- 布爾值 (Boolean):
true或false - 空值 (Null):
null
例如:
people.json文件:
[
{
"name": "張三",
"gender": "男",
"age": 25
},
{
"name": "李四",
"gender": "女",
"age": 23
}
]二、python中JSON模塊
Python 的 JSON模塊是處理 JSON 數(shù)據(jù)的標(biāo)準(zhǔn)工具。它提供了四個核心函數(shù)用于在 JSON 字符串/文件和 Python 對象之間進(jìn)行轉(zhuǎn)換:
2.1 json.load()
從 JSON文件對象讀取并解析為Python 對象。
json.load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 參數(shù):
fp: 一個支持.read()方法的文本文件對象,數(shù)據(jù)從這個文件對象中讀取。cls(可選): 用于自定義 JSON 解碼器的類。通常用于處理復(fù)雜的對象。object_hook(可選): 一個函數(shù),用于在解碼每個 JSON 對象后進(jìn)行自定義處理。它接收一個字典作為參數(shù),并應(yīng)返回一個對象(通常是字典或自定義對象)。parse_float(可選): 一個函數(shù),用于將 JSON 中的浮點數(shù)字符串轉(zhuǎn)換為 Python 對象。默認(rèn)是float。parse_int(可選): 一個函數(shù),用于將 JSON 中的整數(shù)字符串轉(zhuǎn)換為 Python 對象。parse_constant(可選): 一個函數(shù),用于處理 JSON 常量 ('-Infinity','Infinity','NaN')。object_pairs_hook(可選): 一個函數(shù),接收一個由(key, value)對組成的列表,并返回一個對象。object_pairs_hook優(yōu)先于object_hook。**kw(可選): 其他關(guān)鍵字參數(shù)。- 返回值: 一個 Python 對象(通常是
dict或list)。
2.2 json.loads()
從JSON 字符串(str)讀取并解析為 Python 對象。
json.loads(s, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)參數(shù)同
json.dump。
2.3 json.load()
將 Python 對象 編碼為 JSON格式寫入文件。
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True,
check_circular=True, allow_nan=True, cls=None, indent=None,
separators=None, default=None, sort_keys=False, **kw)
- 參數(shù):
obj: 一個必需的參數(shù)。要序列化的 Python 對象。它必須是dict,list,tuple,str,int,float,bool,None,或者是一個實現(xiàn)了__json__()方法的對象。fp: 一個必需的參數(shù)。一個支持.write()方法的文本文件對象(通常由open()函數(shù)返回,模式為'w'或'a')。JSON 數(shù)據(jù)將寫入這個文件對象。skipkeys(可選): 如果為True,當(dāng)字典的鍵不是基本類型(str,int,float,bool,None)時,會自動跳過該鍵值對,而不是引發(fā)TypeError。ensure_ascii(可選): 如果為True,輸出將確保所有非 ASCII 字符都被轉(zhuǎn)義。如果為False,則允許直接輸出這些字符(通常用于生成人類可讀的文件)。check_circular(可選): 如果為True,會檢查容器類型的循環(huán)引用(如列表包含自身),如果發(fā)現(xiàn)則引發(fā)ValueError。如果為False,則不檢查,但遇到循環(huán)引用時行為未定義。allow_nan(可選): 如果為True,允許float類型的NaN,Infinity,-Infinity。如果為False,則在序列化這些值時會引發(fā)ValueError。cls(可選): 用于自定義 JSON 編碼器的類。indent(可選): 用于美化輸出。如果是一個非負(fù)整數(shù)或字符串(如'\t'),則 JSON 數(shù)組元素和對象成員將被換行并使用該值進(jìn)行縮進(jìn),使其更易讀。None(默認(rèn))表示單行輸出。separators(可選): 一個(item_separator, key_separator)元組。默認(rèn)是(', ', ': ')??梢栽O(shè)置為(',', ':')以減少輸出大?。ㄈコ崭瘢?。default(可選): 一個函數(shù),用于處理json模塊無法序列化的對象。該函數(shù)應(yīng)返回一個可序列化的對象,或者引發(fā)TypeError。sort_keys(可選): 如果為True,則字典的輸出將按鍵的字符串表示進(jìn)行排序。**kw(可選): 其他關(guān)鍵字參數(shù)。- 返回值: 無 (
None)。
2.4 json.dumps()
將 Python 對象 編碼為 JSON 字符串(str)。
json.dumps(obj, *, skipkeys=False, ensure_ascii=True,
check_circular=True, allow_nan=True, cls=None, indent=None,
separators=None, default=None, sort_keys=False, **kw)參數(shù)同
json.dump。
三、數(shù)據(jù)格式轉(zhuǎn)換規(guī)則
Python 對象與 JSON 值之間的轉(zhuǎn)換規(guī)則是數(shù)據(jù)處理的關(guān)鍵。
JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
注意:
- JSON 的
null對應(yīng) Python 的None。 - JSON 的
true/false對應(yīng) Python 的True/False。
四、異常處理
JSONDecodeError 是 ValueError 的一個子類,提供了更豐富的錯誤信息,當(dāng)解析 JSON 文檔時發(fā)生錯誤(即 JSON 格式不正確)時會引發(fā)此異常,這對于調(diào)試 JSON 格式問題非常有幫助。
(該異常在 Python 3.5 版本中添加)
exception json.JSONDecodeError(msg, doc, pos)
額外的屬性:
msg: 未格式化的錯誤消息(即描述錯誤原因的文本)。doc: 正在被解析的原始 JSON 文檔(字符串)。pos: 在doc字符串中,解析失敗開始的索引位置(從 0 開始的字符位置)。lineno: 與pos位置對應(yīng)的行號(從 1 開始計數(shù))。colno: 與pos位置對應(yīng)的列號(從 1 開始計數(shù))。
示例:
新建一個bad.json文件:
{
"name": "Alice",
"age": 30, // 這里多了一個逗號
}嘗試解析它:
import json
try:
with open('bad.json', 'r') as file:
data = json.load(file)
except json.JSONDecodeError as e:
print(f"錯誤消息: {e.msg}")
print(f"錯誤位置: 第 {e.lineno} 行, 第 {e.colno} 列")
print(f"錯誤索引: {e.pos}")
# 如果需要,可以打印整個文檔或相關(guān)部分
# print(f"文檔: {e.doc}")可能的輸出:
錯誤消息: Expecting property name enclosed in double quotes 錯誤位置: 第 3 行, 第 2 列 錯誤索引: 35
五、完整示例
解析第一章節(jié)中的people.json文件:
import json
# 1. 定義文件名
filename = 'people.json'
try:
# 2. 打開文件并讀取
with open(filename, 'r', encoding='utf-8') as file:
# 3. 使用 json.load() 解析文件內(nèi)容
data = json.load(file)
# 4. 打印解析結(jié)果,驗證數(shù)據(jù)類型和內(nèi)容
print("=== 解析結(jié)果 ===")
print("原始數(shù)據(jù)類型:", type(data)) # <class 'list'>
print("解析后的數(shù)據(jù) (Python 列表):")
print(data)
print("\n")
# 5. 訪問和使用數(shù)據(jù)
print("=== 信息 ===")
for person in data:
print(f"{person['name']} - {person['gender']}, {person['age']}歲")
except FileNotFoundError:
print(f"錯誤:找不到文件 '{filename}'。")
print("請確保 'people.json' 文件存在于當(dāng)前目錄,或者檢查文件名是否正確。")
except Exception as e:
print(f"發(fā)生未知錯誤: {e}")結(jié)果:
=== 解析結(jié)果 ===
原始數(shù)據(jù)類型: <class 'list'>
解析后的數(shù)據(jù) (Python 列表):
[{'name': '張三', 'gender': '男', 'age': 25}, {'name': '李四', 'gender': '女', 'age': 23}]
=== 信息 ===
張三 - 男, 25歲
李四 - 女, 23歲參考
到此這篇關(guān)于python進(jìn)階之JSON數(shù)據(jù)解析的文章就介紹到這了,更多相關(guān)python JSON數(shù)據(jù)解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將字典轉(zhuǎn)換為DataFrame并進(jìn)行頻次統(tǒng)計的方法
下面小編就為大家分享一篇將字典轉(zhuǎn)換為DataFrame并進(jìn)行頻次統(tǒng)計的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
opencv-python圖像配準(zhǔn)(匹配和疊加)的實現(xiàn)
圖像配準(zhǔn)需是指對不同條件下得到的兩幅或多幅圖像進(jìn)行匹配、疊加的過程。本文詳細(xì)的介紹了如何使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
Python用selenium實現(xiàn)自動登錄和下單的項目實戰(zhàn)
本文主要介紹了Python用selenium實現(xiàn)自動登錄和下單的項目實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python中執(zhí)行存儲過程及獲取存儲過程返回值的方法
這篇文章主要介紹了Python中執(zhí)行存儲過程及獲取存儲過程返回值的方法,結(jié)合實例形式總結(jié)分析了Python調(diào)用存儲過程的常用方法與相關(guān)操作注意事項,需要的朋友可以參考下2017-10-10
專家解析Python文件讀寫的理論與實踐(從基礎(chǔ)概念到工程應(yīng)用)
本文講解Python文件讀寫的基礎(chǔ)與工程實踐,從文件對象、打開與關(guān)閉、上下文管理,到文本與二進(jìn)制文件讀寫、文件指針、編碼問題及異常處理,輔以豐富代碼示例與性能、安全提示,通過日志分析工具的實際項目案例,展示大文件處理、流式讀取、隨機(jī)訪問和編碼容錯的應(yīng)用方法2026-01-01

