Python中利用json庫(kù)進(jìn)行JSON數(shù)據(jù)處理詳解
Python的json庫(kù)用于處理JSON(JavaScript Object Notation)數(shù)據(jù)格式。JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。Python的json庫(kù)提供了函數(shù)來編碼(將Python對(duì)象轉(zhuǎn)換為JSON字符串)和解碼(將JSON 字符串轉(zhuǎn)換為Python對(duì)象)JSON數(shù)據(jù)。
編碼Python對(duì)象為JSON字符串
使用json.dumps()方法將Python對(duì)象編碼為JSON字符串:
import json
data = {
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
}
# dict -> json
str = json.dumps(data, indent=4)
print(str)
arr = [data, data]
# list -> json
arr_str = json.dumps(arr, indent=4)
print(arr_str)
運(yùn)行結(jié)果如下:
{
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
}
[
{
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
},
{
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
}
]
indent參數(shù)用于美化輸出,使JSON字符串更具可讀性。
解碼JSON字符串為Python對(duì)象
使用json.loads()方法將JSON字符串解碼為Python對(duì)象(通常是字典或列表):
import json
object_str = """
{
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
}
"""
obj = json.loads(object_str)
print(obj)
array_str = """
[
{
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
},
{
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
}
]
"""
arr = json.loads(array_str)
print(arr)
運(yùn)行結(jié)果如下:
{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}
[{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}, {'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}]
將Python對(duì)象寫入JSON文件
json.dump()函數(shù)也是用于將Python對(duì)象編碼成JSON格式,但它直接將編碼后的數(shù)據(jù)寫入到一個(gè)文件中,而不是返回字符串。
import json
data = {
"name": "Morris",
"age": 18,
"mail": "Morris@18.com"
}
???????# dict -> json file
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)從文件中讀取JSON數(shù)據(jù)
使用json.load()方法從文件中讀取JSON數(shù)據(jù)并將其解析為Python對(duì)象:
import json
# json file -> dict
with open('data.json', 'r', encoding='utf-8') as f:
obj = json.load(f)
print(obj)
運(yùn)行結(jié)果如下:
{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}
處理復(fù)雜對(duì)象
有時(shí)你可能需要處理包含復(fù)雜對(duì)象(如自定義類實(shí)例)的JSON數(shù)據(jù)。你可以通過實(shí)現(xiàn)自定義的編碼器和解碼器來處理這些對(duì)象。
自定義編碼器
要實(shí)現(xiàn)自定義編碼器,你需要?jiǎng)?chuàng)建一個(gè)繼承自json.JSONEncoder的類,并重寫default方法:
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
# 其他自定義處理
return json.JSONEncoder.default(self, obj)
data = {
"name": "Morris",
"timestamp": datetime.now()
}
json_str = CustomEncoder().encode(data)
print(json_str)
運(yùn)行結(jié)果如下:
{"name": "Morris", "timestamp": "2024-12-31 14:16:55"}
自定義解碼器
要實(shí)現(xiàn)自定義解碼器,你需要?jiǎng)?chuàng)建一個(gè)繼承自json.JSONDecoder的類,并重寫object_hook或object_pairs_hook方法:
import json
from datetime import datetime
def datetime_parser(dct):
for key, value in dct.items():
if isinstance(value, str):
try:
# 假設(shè)日期格式是 "YYYY-MM-DD"
dct[key] = datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
except ValueError:
# 如果不是日期格式,則保持原樣
pass
return dct
json_str = """
{
"name": "Morris",
"timestamp": "2024-12-31 14:16:55"
}
"""
data = json.loads(json_str, object_hook=datetime_parser)
print(data)
print(data['timestamp'])
運(yùn)行結(jié)果如下:
{'name': 'Morris', 'timestamp': datetime.datetime(2024, 12, 31, 14, 16, 55)}
2024-12-31 14:16:55
以上就是Python中利用json庫(kù)進(jìn)行JSON數(shù)據(jù)處理詳解的詳細(xì)內(nèi)容,更多關(guān)于Python JSON數(shù)據(jù)處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python實(shí)現(xiàn)區(qū)分I和L
最討厭分不清I與l,所以為了解決這個(gè)問題,這篇文章小編專門為大家介紹了如何使用Python實(shí)現(xiàn)區(qū)分這些混淆字符,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
OpenCV-Python實(shí)現(xiàn)輪廓擬合
本文將結(jié)合實(shí)例代碼,介紹OpenCV-Python實(shí)現(xiàn)輪廓擬合,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
Python實(shí)現(xiàn)XGBoost算法的應(yīng)用實(shí)戰(zhàn)
XGBoost(Extreme Gradient Boosting)是一種高效且廣泛使用的集成學(xué)習(xí)算法,它屬于梯度提升樹(GBDT)模型的一種改進(jìn),本文將結(jié)合實(shí)際案例,詳細(xì)介紹如何在Python中使用XGBoost算法進(jìn)行模型訓(xùn)練和預(yù)測(cè),需要的朋友可以參考下2024-08-08
Python?OpenCV超詳細(xì)講解調(diào)整大小與圖像操作的實(shí)現(xiàn)
OpenCV用C++語(yǔ)言編寫,它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實(shí)時(shí)視覺應(yīng)用,并在可用時(shí)利用MMX和SSE指令,本篇文章帶你通過OpenCV實(shí)現(xiàn)重調(diào)大小與圖像裁剪2022-04-04
python中將函數(shù)賦值給變量時(shí)需要注意的一些問題
變量賦值是我們?cè)谌粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于python中將函數(shù)賦值給變量時(shí)需要注意的一些問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-08-08

