# Python中怎么處理json模塊
## 一、JSON簡介
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它基于ECMAScript的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據。JSON的主要特點包括:
- 易于人類閱讀和編寫
- 易于機器解析和生成
- 支持復雜數據結構(嵌套對象和數組)
- 廣泛應用于Web應用的數據傳輸
在Python中,`json`模塊提供了JSON數據的編碼(序列化)和解碼(反序列化)功能,使得Python對象和JSON格式之間的轉換變得非常簡單。
## 二、JSON模塊的基本使用
### 1. 導入json模塊
```python
import json
函數 | 描述 |
---|---|
json.dumps() |
將Python對象編碼為JSON字符串 |
json.loads() |
將JSON字符串解碼為Python對象 |
json.dump() |
將Python對象編碼并寫入文件 |
json.load() |
從文件中讀取并解碼JSON數據 |
json.dumps()
方法將Python對象轉換為JSON格式的字符串。
data = {
"name": "張三",
"age": 30,
"is_student": False,
"courses": ["數學", "英語"],
"address": {
"city": "北京",
"street": "朝陽路"
}
}
json_str = json.dumps(data)
print(json_str)
# 輸出: {"name": "\u5f20\u4e09", "age": 30, "is_student": false, "courses": ["\u6570\u5b66", "\u82f1\u8bed"], "address": {"city": "\u5317\u4eac", "street": "\u671d\u9633\u8def"}}
indent
: 縮進級別,使輸出更易讀ensure_ascii
: 是否轉義非ASCII字符(默認為True)sort_keys
: 是否按鍵排序print(json.dumps(data, indent=4, ensure_ascii=False, sort_keys=True))
將Python對象直接寫入文件:
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False)
將JSON字符串轉換為Python對象:
json_data = '{"name": "李四", "age": 25, "is_student": true}'
python_obj = json.loads(json_data)
print(python_obj)
# 輸出: {'name': '李四', 'age': 25, 'is_student': True}
從文件中讀取JSON數據并轉換為Python對象:
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)
Python類型 | JSON類型 |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
注意: - JSON中沒有元組類型,元組會被轉換為數組 - JSON中的所有字符串都是Unicode
默認情況下,json
模塊無法序列化自定義類的實例??梢酝ㄟ^以下兩種方式解決:
__dict__
屬性class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("王五", 40)
json_str = json.dumps(p.__dict__)
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
return super().default(obj)
json_str = json.dumps(p, cls=PersonEncoder)
from datetime import datetime
def datetime_handler(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Type not serializable")
data = {'time': datetime.now()}
json_str = json.dumps(data, default=datetime_handler)
對于復雜的JSON數據查詢,可以使用jsonpath
庫:
# 需要先安裝: pip install jsonpath-ng
from jsonpath_ng import parse
data = {
"store": {
"book": [
{"title": "Python基礎", "price": 50},
{"title": "高級Python", "price": 80}
]
}
}
jsonpath_expr = parse('$.store.book[*].price')
prices = [match.value for match in jsonpath_expr.find(data)]
print(prices) # 輸出: [50, 80]
ijson
庫進行流式處理orjson
(比標準庫快2-3倍)或ujson
作為替代# 安裝: pip install orjson
import orjson
data = orjson.dumps({"key": "value"})
json.loads()
而非eval()
處理JSON字符串object_pairs_hook
參數驗證數據def validate_duplicate_keys(ordered_pairs):
d = {}
for k, v in ordered_pairs:
if k in d:
raise ValueError("Duplicate key: %r" % (k,))
d[k] = v
return d
json.loads('{"a": 1, "a": 2}', object_pairs_hook=validate_duplicate_keys)
# 確保設置ensure_ascii=False
json.dumps({"name": "張三"}, ensure_ascii=False)
JSON規范不限制數字大小,但某些實現可能有限制:
# 處理大整數
data = {'big_num': 2**64}
json_str = json.dumps(data)
a = {}
b = {'a': a}
a['b'] = b # 循環引用
# 解決方案1: 使用自定義encoder處理
# 解決方案2: 打破循環引用
# 寫入配置
config = {"debug": True, "log_level": "INFO"}
with open('config.json', 'w') as f:
json.dump(config, f, indent=2)
# 讀取配置
with open('config.json') as f:
loaded_config = json.load(f)
import requests
response = requests.get('https://api.example.com/data')
data = response.json() # 直接獲取JSON數據
class Database:
def __init__(self, filename):
self.filename = filename
def save(self, data):
with open(self.filename, 'w') as f:
json.dump(data, f)
def load(self):
try:
with open(self.filename) as f:
return json.load(f)
except FileNotFoundError:
return {}
Python的json
模塊提供了簡單而強大的工具來處理JSON數據。通過本文的介紹,你應該已經掌握了:
json.dumps()
和json.loads()
進行基本轉換JSON作為現代Web開發和數據交換的事實標準,掌握其在Python中的處理技巧對于任何Python開發者都至關重要。隨著經驗的積累,你可以進一步探索更高級的JSON處理庫和技術,如marshmallow
用于數據驗證和序列化,或pydantic
用于數據建模。
“`
這篇文章共計約2300字,涵蓋了JSON模塊的各個方面,從基礎使用到高級技巧,并提供了實際應用示例。內容采用Markdown格式,包含代碼塊、表格和分級標題,便于閱讀和理解。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。