目錄
1. 前言
2. json 庫基本概念
3. json 的適應場景
4. json 庫的基本用法
4.1 導 json入 模塊
4.2 將 Python 對象轉換為 JSON 字符串
4.3 將 JSON 字符串轉換為 Python 對象
4.4 將 Python 對象寫入 JSON 文件
4.5 從 JSON 文件讀取數據
4.6 json 的其他方法
5. json 庫的高級用法
5.1 自定義對象的序列化與反序列化在
5.2 處理非 ASCII 字符
5.3 使用 indent 參數美化輸出
6. json 庫的異常處理
6.1 常見的異常類型
6.2 異常處理示例
7. 總結
1. 前言
在我們日常的 Python 編程中,數據的存儲與傳遞是不可避免的一個環節。想象一下,我們在開發一個應用程序時,需要將一些配置信息存儲起來,或者要將數據發送到另一個系統中。這時候,我們就需要一種高效、便捷的方式來完成這個。任務JSON(JavaScript Object Notation),作為一種輕量級的數據交換格式,正好能滿足我們的需求。而 Python 中的 json 庫,則為我們提供了簡單易用的接口來處理 JSON 數據。
2. json 庫基本概念
JSON 是一種基于文本格式的數據表示方法,易于和閱讀編寫,同時也易于機器解析和生成。它基于 JavaScript 的一個子集,但已經成為一種獨立的數據格式,被廣泛應用于各種編程語言中。在 Python 中,json 庫就是專門用于處理 JSON 數據的。
JSON 數據結構主要包括以下兩種基本類型:
????????對象 (Object) :一組無序的鍵值對,類似于 Python 中的字典。例如:{"name": "John", "age": 30}
,其中 "name" 和 "age" 是鍵,對應的值分別是 "John" 和 30 。
????????數組(Array) :一個有序的值的集合,類似于 Python 中的列表。例如:[1, 2, 3, 4]
。
json 庫的核心功能就是實現 Python 數據類型與 JSON 數據類型的相互轉換。
3. json 的適應場景
-
數據存儲 :將數據以 JSON 格式存儲到文件或數據庫中,便于后續讀取和修改。例如,保存配置文件、用戶數據等。
-
數據交換 :在不同的系統或組件之間傳遞數據,特別是在 開 Web發中,前后端之間常用 JSON 格式進行數據交互。
-
API 數據處理 :許多 Web API 返回的數據都是 JSON 格式,使用 json 庫可以方便地解析和處理這些數據。
4. json 庫的基本用法
4.1 導 json入 模塊
在 Python 中,我們可以直接使用內置的 json 模塊,無需額外安裝。通過以下代碼導入 json 模塊:
import json
4.2 將 Python 對象轉換為 JSON 字符串
使用 json.dumps()
方法將可以 Python 對象(如字典、列表等)轉換為 JSON 格式的字符串。這個方法的語法如下:
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)
其中,obj
是要轉換的 Python 對象,其他參數用于控制轉換過程中的各種選項。
示例 :
data = {"name": "John","age": 03,"city": "New York"
}json_str = json.dumps(data)
print(json_str)
輸出結果:
{"name": "John", "age": 30, "city": "New York"}
可以看到,Python 字典被成功轉換為 JSON 格式的字符串。
4.3 將 JSON 字符串轉換為 Python 對象
使用 json.loads()
方法可以將 JSON 格字符串式的轉換為 Python 對象。這個方法的語法如下:
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
其中,s
是 JSON 格式的字符串。
示例 :
json_str = '{"name": "John", "age": 30, "city": "New York"}'data = json.loads(json_str)
print(data)
print(type(data))
輸出結果:
{'name': 'John', 'age': 30, 'city': 'New York'}
<class 'dict'>
JSON 字符串被轉換為 字 Python典。
4.4 將 Python 對象寫入 JSON 文件
使用 json.dump()
方法可以直接將 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)
其中,obj
是要寫入的 Python 對象,fp
是一個文件對象。
示例 :
data = {"name": "John","age": 30,"city": "New York"
}with open("data.json", "w") as f:json.dump(data, f)
這段代碼將 Python 字典寫入到名為 “data.json” 的文件中。
4.5 從 JSON 文件讀取數據
使用 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)
其中,fp
是一個文件對象。
示例 :
with open("data.json", "r") as f:data = json.load(f)print(data)
讀取 “data.json” 文件中的數據并打印出來。
4.6 json 的其他方法
除了上述常用的 dumps()
、loads()
、dump()
和 load()
方法外,json 庫還提供了一些其他方法和常量,用于處理特殊情況。
-
json.JSONEncoder
和json.JSONDecoder
:這兩個類分別用于自定義 JSON 編碼器和解碼器,可以處理一些特殊的類型轉換問題。 -
json.JSONDecodeError
:當解析 JSON 數據出錯時,會拋出這個異常,我們可以使用它來進行錯誤處理。
5. json 庫的高級用法
5.1 自定義對象的序列化與反序列化在
實際開發中,我們可能會遇到需要序列化自定義對象的情況。默認情況下,json 庫無法直接序列化自定義對象,但我們可以自定義一個編碼器來實現這個功能。
import jsonclass Person:def __init__(self, name, age):self.name = nameself.age = ageclass PersonEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, Person):return {"name": obj.name, "age": obj.age}return super().default(obj)person = Person("John", 30)
json_str = json.dumps(person, cls=PersonEncoder)
print(json_str)
輸出結果:
{"name": "John", "age": 30}
我們可以看到通過,自定義編碼器,成功將自定義的 Person 對象序列化為 JSON 字符串。同樣地,我們也可以通過自定義解碼器來實現 JSON 字符串到自定義對象的反序列化。
5.2 處理非 ASCII 字符
在處理包含非 ASCII 字符的 JSON 數據時,我們可以使用 ensure_ascii
參數來控制是否將非 ASCII 字符轉義。默認情況下,ensure_ascii
參數為 True,非 ASCII 字符會被轉義為 Unicode 編碼。
data = {"name": "張三", "city": "北京"}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
輸出結果:
{"name": "張三", "city": "北京"}
當 ensure_ascii
參數為 False 時,非 ASCII 字符會以原始形式輸出,這樣更便于閱讀和理解。
5.3 使用 indent 參數美化輸出
在調試或閱讀 JSON 數據時,我們可以通過設置 indent
參數來美化 JSON 輸出的格式,使其更易于和閱讀。indent 參數指定了縮進的空格數。
data = {"name": "John","age": 30,"hobbies": ["reading", "traveling", "sports"]
}json_str = json.dumps(data, indent=4)
print(json_str)
輸出結果:
{"name": "John","age": 30,"hobbies": ["reading","traveling","sports"]
}
可以看到,通過設置 indent
參數,輸出的 JSON 數據格式更加清晰美觀。
6. json 庫的異常處理
在使用 json 庫進行數據處理時,可能會遇到一些異常情況例如,無效的 JSON 格式、不支持的數據類型等。我們需要對這些異常進行有效的處理,以確保程序的健壯性。
6.1 常見的異常類型
-
json.JSONDecodeError
:當解析 JSON 數據出錯時拋出,例如 JSON 格式不正確。 -
TypeError
:當嘗試序列化一個不支持的數據類型時拋出。
6.2 異常處理示例
import jsonjson_str = '{"name": "John", "age": 30, "hobbies": ["reading", "traveling"]'
try:data = json.loads(json_str)
except json.JSONDecodeError as e:print(f"JSON 解碼錯誤:{e}")
except Exception as e:print(f"發生錯誤:{e}")
輸出結果:
JSON 解碼錯誤:Expecting ',' delimiter: line 1 column 46 (char 45)
通過捕獲異常,我們可以及時發現并處理問題,避免程序崩潰。
7. 總結
json 庫作為 Python 的內置模塊,是我們在進行數據存儲、傳遞和交換時不可或缺的工具之一。其為我們提供了簡單而強大的工具來處理 JSON 數據。它不僅能夠輕松地實現 Python 對象與 JSON 數據之間的相互轉換,還提供了豐富的參數和方法來滿足各種復雜的需求。我是橙色小博,關注我,一起在人工智能領域學習進步!