目錄
- `json.dump()` 的語法
- 參數說明
- 1. `obj`
- 2. `fp`
- 3. `skipkeys`
- 4. `ensure_ascii`
- 5. `check_circular`
- 6. `allow_nan`
- 7. `cls`
- 8. `indent`
- 9. `separators`
- 10. `default`
- 11. `sort_keys`
- **示例代碼**
- **基本用法**
- 使用 `indent` 和 `separators`
- 使用 `default` 參數
- 總結
json.dump()
是 Python 中 json
模塊用于將 Python 數據結構序列化為 JSON 格式并寫入文件的方法。它提供了多個參數,用于控制序列化的行為和輸出格式。以下是 json.dump()
的參數及其說明:
json.dump()
的語法
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)
參數說明
1. obj
- 類型:任何可序列化的 Python 數據結構(如字典、列表、字符串、數字等)。
- 說明:這是需要被序列化為 JSON 格式的 Python 對象。
2. fp
- 類型:文件對象。
- 說明:必須是一個支持
.write()
方法的文件對象,通常是通過open()
函數以文本模式('w'
或'a'
)打開的文件。
3. skipkeys
- 類型:布爾值,默認為
False
。 - 說明:
- 如果設置為
True
,則在序列化字典時,會跳過那些鍵不是基本類型(如字符串、數字、元組等)的鍵值對。 - 如果設置為
False
,則會拋出TypeError
異常,提示鍵不可序列化。
- 如果設置為
4. ensure_ascii
- 類型:布爾值,默認為
True
。 - 說明:
- 如果設置為
True
,則輸出的 JSON 字符串中所有非 ASCII 字符都會被轉義為 Unicode 轉義序列(如\uXXXX
)。 - 如果設置為
False
,則會直接輸出非 ASCII 字符(如中文、日文等),這在處理國際化數據時非常有用。
- 如果設置為
5. check_circular
- 類型:布爾值,默認為
True
。 - 說明:
- 如果設置為
True
,則在序列化過程中會檢查對象是否包含循環引用(即對象引用自身)。如果發現循環引用,會拋出ValueError
異常。 - 如果設置為
False
,則不會進行循環引用檢查,但可能會導致程序崩潰或無限遞歸。
- 如果設置為
6. allow_nan
- 類型:布爾值,默認為
True
。 - 說明:
- 如果設置為
True
,則允許序列化float('nan')
、float('inf')
和float('-inf')
等特殊浮點值。 - 如果設置為
False
,則會拋出ValueError
異常,提示這些值不可序列化。
- 如果設置為
7. cls
- 類型:類,默認為
None
。 - 說明:
- 指定一個自定義的 JSON 編碼器類。如果需要自定義序列化邏輯,可以繼承
json.JSONEncoder
并重寫其方法。 - 如果未指定,則使用默認的
json.JSONEncoder
。
- 指定一個自定義的 JSON 編碼器類。如果需要自定義序列化邏輯,可以繼承
8. indent
- 類型:整數或字符串,默認為
None
。 - 說明:
- 用于控制輸出的 JSON 字符串的縮進格式。
- 如果設置為整數,則表示縮進的空格數(例如
indent=4
表示每級縮進 4 個空格)。 - 如果設置為字符串,則表示縮進的字符(例如
indent="\t"
表示每級縮進一個制表符)。 - 如果設置為
None
,則輸出的 JSON 字符串不會進行格式化,而是緊湊的單行輸出。
9. separators
- 類型:元組,默認為
None
。 - 說明:
- 指定 JSON 數據中鍵值對和數組元素之間的分隔符。
- 默認值為
(', ', ': ')
,即鍵值對之間用逗號和空格分隔,鍵和值之間用冒號和空格分隔。 - 如果需要緊湊的輸出,可以設置為
(',', ':')
,去掉多余的空格。
10. default
- 類型:函數,默認為
None
。 - 說明:
- 指定一個函數,用于處理無法直接序列化的對象。
- 當
json.dump()
遇到無法序列化的對象時,會調用這個函數,并將對象作為參數傳入。該函數需要返回一個可序列化的值。
11. sort_keys
- 類型:布爾值,默認為
False
。 - 說明:
- 如果設置為
True
,則在序列化字典時,會按照鍵的字典序對鍵值對進行排序。 - 如果設置為
False
,則不會對鍵值對進行排序,保持原始順序。
- 如果設置為
示例代碼
基本用法
import jsondata = {"name": "Alice","age": 25,"city": "New York","hobbies": ["reading", "traveling", "coding"]
}# 將數據寫入 JSON 文件
with open("data.json", "w", encoding="utf-8") as file:json.dump(data, file, ensure_ascii=False, indent=4)
生成的 data.json
文件內容:
{"name": "Alice","age": 25,"city": "New York","hobbies": ["reading","traveling","coding"]
}
使用 indent
和 separators
import jsondata = {"name": "Alice","age": 25,"city": "New York"
}# 緊湊格式輸出
with open("data.json", "w", encoding="utf-8") as file:json.dump(data, file, separators=(',', ':'))# 格式化輸出
with open("data_pretty.json", "w", encoding="utf-8") as file:json.dump(data, file, indent=4)
生成的 data.json
文件內容(緊湊格式):
{"name":"Alice","age":25,"city":"New York"}
生成的 data_pretty.json
文件內容(格式化輸出):
{"name": "Alice","age": 25,"city": "New York"
}
使用 default
參數
假設有一個包含日期對象的字典:
import json
from datetime import datetimedata = {"name": "Alice","birthday": datetime(1995, 5, 15)
}# 自定義序列化函數
def serialize_datetime(obj):if isinstance(obj, datetime):return obj.isoformat()raise TypeError(f"Type {type(obj)} is not serializable")# 將數據寫入 JSON 文件
with open("data.json", "w", encoding="utf-8") as file:json.dump(data, file, default=serialize_datetime, indent=4)
生成的 data.json
文件內容:
{"name": "Alice","birthday": "1995-05-15T00:00:00"
}
總結
json.dump()
是一個功能強大的方法,用于將 Python 數據結構序列化為 JSON 格式并寫入文件。- 它提供了豐富的參數,用于控制序列化的行為和輸出格式,例如
ensure_ascii
、indent
、separators
和default
等。 - 通過合理使用這些參數,可以滿足各種復雜的序列化需求。