亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python?JSON模塊loads、load、dump、dumps函數(shù)舉例詳解

 更新時(shí)間:2025年05月19日 09:10:50   作者:Karl_zhujt  
這篇文章主要介紹了Python?JSON模塊loads、load、dump、dumps函數(shù)的相關(guān)資料,分別處理文件和字符串的序列化與反序列化,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1 函數(shù)介紹

函數(shù)名稱函數(shù)描述
json.load()用于從文件對(duì)象中讀取 JSON 數(shù)據(jù),并將其解析為 Python 對(duì)象。
json.loads()用于將JSON 格式的字符串解析為 Python 對(duì)象
json.dump()用于將 Python 對(duì)象序列化為 JSON 格式,并將其寫入文件。
json.dumps()用于將 Python 對(duì)象序列化為JSON 格式的字符串。

2 json.load()

json.load()是Python中json模塊提供的一個(gè)函數(shù),用于從文件對(duì)象中讀取JSON數(shù)據(jù),并將其解析為Python對(duì)象。

2.1 語法格式

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

參數(shù)說明:

fp: 一個(gè)包含要執(zhí)行反序列化的 JSON 文檔的支持.read()的 text file 或 binary file。
cls: 如果設(shè)定此參數(shù),則使用自定義的JSON解碼器。任何傳遞給load()方法的多余關(guān)鍵字參數(shù)都會(huì)被傳遞給cls的構(gòu)造器。如果傳入None(默認(rèn)值),則會(huì)使用JSONDecoder。
object_hook: 可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以任意被解碼的對(duì)象字面值(即一個(gè)dict)作為參數(shù)的函數(shù)。該函數(shù)的返回值將代替該dict使用。此特性可被用于實(shí)現(xiàn)自定義解碼器,例如JSON-RPC類提示。默認(rèn)值為None。
parse_float: 可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以代表每個(gè)要解碼的JSON浮點(diǎn)數(shù)的字符串作為參數(shù)的函數(shù)。如為None(默認(rèn)值),則它等價(jià)于float(num_str)。這可被用于將JSON浮點(diǎn)數(shù)解析為自定義數(shù)據(jù)類型,例如decimal.Decimal。
parse_int: 可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以代表每個(gè)要解碼的JSON整數(shù)的字符串作為參數(shù)的函數(shù)。如為None(默認(rèn)值),則它等價(jià)于int(num_str)。這可被用于將JSON整數(shù)解析為自定義數(shù)據(jù)類型,例如float。
parse_constant: 可選函數(shù),如果設(shè)置,將是一個(gè)以下列字符串之一作為參數(shù)的函數(shù): -InfinityInfinity 或 NaN。 這可被用于在遇到無效的 JSON 數(shù)字時(shí)引發(fā)異常。 默認(rèn)值為 None。
object_pairs_hook: 可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以對(duì)照值的有序列表進(jìn)行解碼的任意對(duì)象字面值作為參數(shù)的函數(shù)。該函數(shù)的返回值將代替該dict使用。此特性可被用于實(shí)現(xiàn)自定義解碼器。如果還設(shè)置了object_hook,則object_pairs_hook的優(yōu)先級(jí)更高,默認(rèn)值為None。

2.2 異常說明

JSONDecodeError: 當(dāng)被反序列化的數(shù)據(jù)不是合法的JSON文檔。
UnicodeDecodeError: 當(dāng)被反序列化的數(shù)據(jù)不包含UTF-8,UTF-16UTF-32編碼的數(shù)據(jù)。

2.3 返回值說明

json.load()返回一個(gè)Python對(duì)象,具體類型取決于JSON文件的內(nèi)容:

JSON對(duì)象({})會(huì)被解析為Python的dict。
JSON數(shù)組([])會(huì)被解析為Python的list。
JSON字符串("...")會(huì)被解析為Python的str。
JSON數(shù)字(123或12.3)會(huì)被解析為Python的intfloat。
JSON的true、falsenull會(huì)被解析為Python的True、FalseNone。

2.4 注意事項(xiàng)

  • 文件編碼: 在打開文件時(shí),確保指定正確的編碼(如utf-8),否則可能會(huì)因編碼問題導(dǎo)致解析失敗。
  • 文件路徑: 確保文件路徑正確,否則會(huì)拋出FileNotFoundError異常。
  • JSON格式必須正確: 如果JSON文件格式不正確(如缺少引號(hào)、括號(hào)不匹配等),會(huì)拋出json.JSONDecodeError異常。
  • 性能問題: 對(duì)于非常大的JSON文件,json.load()會(huì)將整個(gè)文件加載到內(nèi)存中。如果內(nèi)存有限,可以考慮使用流式解析工具(如ijson)。

2.5 示例

2.5.1 示例數(shù)據(jù)

data.json文件內(nèi)容如下:

{
	"name": "辰南",
	"age": 10028.26,
	"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}

2.5.2 基本用法

import json

# 打開文件并讀取JSON數(shù)據(jù)
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

print(data) # {'name': '辰南', 'age': 10028, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}
print(type(data)) # <class 'dict'>

2.5.3 自定義解析

import json

def custom_parse_float(value):
    """
    自定義浮點(diǎn)數(shù)解析函數(shù)
    :param value:傳入浮點(diǎn)數(shù)
    :return:返回保留一位小數(shù)的值
    """
    return round(float(value), 1)  # 保留一位小數(shù)


# 打開文件并讀取 JSON 數(shù)據(jù)
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f, parse_float=custom_parse_float)

print(data)  # {'name': '辰南', 'age': 10028.3, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}

3 json.loads()

json.loads()是Python中json模塊提供的一個(gè)函數(shù),用于將JSON格式的字符串解析為Python對(duì)象。JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于數(shù)據(jù)傳輸和配置文件。

3.1 語法格式

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

類似于load(),但不是針對(duì)文件型對(duì)象,而是使用這個(gè)轉(zhuǎn)換表將s(一個(gè)包含JSON的str,bytesbytearray實(shí)例)反序列化為Python對(duì)象。

3.2 返回值說明

json.loads()返回一個(gè)Python對(duì)象,具體類型取決于JSON文件的內(nèi)容:

JSON對(duì)象({})會(huì)被解析為Python的dict。
JSON數(shù)組([])會(huì)被解析為Python的list。
JSON字符串("...")會(huì)被解析為Python的str。
JSON數(shù)字(123或12.3)會(huì)被解析為Python的intfloat。
JSON的true、falsenull會(huì)被解析為Python的TrueFalseNone。

3.3 注意事項(xiàng)

  • JSON字符串必須符合格式: 如果JSON字符串格式不正確(如缺少引號(hào)、括號(hào)不匹配等),會(huì)拋出json.JSONDecodeError異常。
  • 性能問題: 對(duì)于非常大的JSON數(shù)據(jù),建議使用json.load()從文件流中讀取,而不是一次性加載到內(nèi)存中。

3.4 示例

3.4.1 基本用法

import json

# JSON 格式的字符串
json_str = '{"name": "辰南", "age": 10028.3, "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]}'

# 解析為 Python 字典
data = json.loads(json_str)

print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}
print(type(data)) # <class 'dict'>

3.4.2 自定義解析

import json

# JSON 格式的字符串
json_str = '{"name": "辰南", "age": 10028.26, "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]}'


# 自定義浮點(diǎn)數(shù)解析函數(shù)
def custom_parse_float(value):
    """
    自定義浮點(diǎn)數(shù)解析函數(shù)
    :param value:傳入浮點(diǎn)數(shù)
    :return:返回保留一位小數(shù)的值
    """
    return round(float(value), 1)  # 保留一位小數(shù)


# 解析 JSON 字符串
data = json.loads(json_str, parse_float=custom_parse_float)

print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}
print(type(data))  # <class 'dict'>

3.4.3 網(wǎng)絡(luò)請(qǐng)求

import requests
import json

# 字典類型的表單參數(shù)
data = {'辰南': '從神墓爬出來',
        '楚月': '辰南老婆之一'}
# 發(fā)送網(wǎng)絡(luò)請(qǐng)求
res = requests.post('http://httpbin.org/post', data=data)
res_dict = json.loads(res.text)  # 將響應(yīng)數(shù)據(jù)轉(zhuǎn)換為字典類型
print(res_dict)
print(type(res_dict))

4 json.dump()

json.dump()是Python中json模塊提供的一個(gè)函數(shù),用于將Python對(duì)象序列化為JSON格式,并將其寫入文件。與json.dumps()不同,json.dump()直接將數(shù)據(jù)寫入文件對(duì)象,而不是返回一個(gè)字符串。

4.1 語法格式

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: 要序列化的Python對(duì)象。
fp: 文件型對(duì)象obj將為序列化輸出的目標(biāo)。json模塊總是產(chǎn)生str對(duì)象,而不是bytes對(duì)象,因此fp.write()必須支持str輸入
skipkeys: 如為True,則不為基本類型(str,int,float,bool,None)的鍵將被跳過而不會(huì)引發(fā)TypeError。默認(rèn)為False。
ensure_ascii: 如為True(默認(rèn)值),則輸出將保證對(duì)所有輸入的非ASCII字符進(jìn)行轉(zhuǎn)義。如為False,這些字符將被原樣輸出。
check_circular: 如為False,則對(duì)容器類型的循環(huán)引用檢查會(huì)被跳過并且循環(huán)引用將導(dǎo)致RecursionError(或更糟的情況)。默認(rèn)為True。
allow_nan: 如為False,則對(duì)超范圍的float值(nan,inf,-inf)進(jìn)行序列化將導(dǎo)致ValueError,以嚴(yán)格遵循JSON規(guī)范。如為True(默認(rèn)值),則將使用它們的JavaScript等價(jià)形式(NaN,Infinity,-Infinity)。
cls: 如果設(shè)置,則重寫為一個(gè)帶有default()方法的自定義JSON編碼器,用以序列化為自定義的數(shù)據(jù)類型。如為None(默認(rèn)值),則使用JSONEncoder。
indent: 如為一個(gè)正整數(shù)或字符串,JSON數(shù)組元素和對(duì)象成員將按其所指定的縮進(jìn)層級(jí)美化打印。正整數(shù)表示每級(jí)縮進(jìn)指定數(shù)量的空格;字符串(如"\t")則被用于每級(jí)縮進(jìn)。如為零、負(fù)數(shù)或""(空字符串),則僅插入換行符。如為None(默認(rèn)值),則使用最緊湊表示形式。
separators: 一個(gè)二元組:(item_separator,key_separator)。如為None(默認(rèn)值),則默認(rèn)當(dāng)indent為None時(shí)separators為(',',':'),否則為(',',':')。要使用最緊湊形式的JSON,可指定(‘,’,‘:’)來去除空格。
default: 當(dāng)對(duì)象無法被序列化時(shí)將被調(diào)用的函數(shù)。它應(yīng)該返回一個(gè)可被JSON編碼的版本或是引發(fā)TypeError。如為None(默認(rèn)值),則會(huì)引發(fā)TypeError。
sort_keys: 如為True,則字典輸出將按鍵排序。默認(rèn)為False。

4.2 返回值說明

json.dump() 沒有返回值,它會(huì)將序列化后的 JSON 數(shù)據(jù)直接寫入文件。

4.3 注意事項(xiàng)

  • 文件模式: 在打開文件時(shí),確保使用寫入模式(如'w'),否則會(huì)拋出錯(cuò)誤。
  • 非字符串鍵: 如果字典的鍵不是字符串類型,默認(rèn)會(huì)拋出TypeError??梢酝ㄟ^設(shè)置skipkeys=True跳過這些鍵。
  • 特殊值: 默認(rèn)情況下,NaN、Infinity等特殊值可以被序列化。如果不需要,可以設(shè)置allow_nan=False。性能問題: 對(duì)于非常大的數(shù)據(jù),json.dump()會(huì)將整個(gè)對(duì)象加載到內(nèi)存中。如果內(nèi)存有限,可以考慮使用流式寫入工具。

4.4 示例

4.4.1 基本用法

import json

# Python 字典
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}

# 打開文件并寫入 JSON 數(shù)據(jù)
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f)

4.4.2 自定義化序列

如果 Python 對(duì)象中包含無法直接序列化的類型(如 datetime),可以使用default參數(shù)指定一個(gè)處理函數(shù):

import json
from datetime import datetime

def custom_serializer(obj):
    """
    自定義序列化函數(shù)
    :param obj:
    :return:
    """
    # 判斷數(shù)據(jù)是否為日期
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%d %H:%M:%S')  # 將 datetime 轉(zhuǎn)換為字符串
    raise TypeError("Type not serializable")


# Python 字典,包含 datetime 對(duì)象
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"],
    "created": datetime.now()
}

# 打開文件并寫入 JSON 數(shù)據(jù)
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, default=custom_serializer, indent=4, ensure_ascii=False)

5 json.dumps()

json.dumps()是Python中json模塊提供的一個(gè)函數(shù),用于將Python對(duì)象序列化為JSON格式的字符串。與json.dump()不同,json.dumps()返回一個(gè)字符串,而不是直接寫入文件。

5.1 語法格式

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)

使用這個(gè)轉(zhuǎn)換表將obj序列化為JSON格式的str。其參數(shù)的含義與dump()中的相同。

5.2 返回值說明

json.dumps() 返回一個(gè) JSON 格式的字符串。

5.3 注意事項(xiàng)

  • 非字符串鍵: 如果字典的鍵不是字符串類型,默認(rèn)會(huì)拋出TypeError??梢酝ㄟ^設(shè)置skipkeys=True跳過這些鍵。
  • 特殊值: 默認(rèn)情況下,NaN、Infinity等特殊值可以被序列化。如果不需要,可以設(shè)置allow_nan=False。
  • 編碼問題: 如果ensure_ascii=True(默認(rèn)),所有非ASCII字符會(huì)被轉(zhuǎn)義為\uXXXX格式。如果希望保留原始字符,可以設(shè)置ensure_ascii=False。
  • 性能問題: 對(duì)于非常大的數(shù)據(jù),json.dumps()會(huì)將整個(gè)對(duì)象加載到內(nèi)存中。如果內(nèi)存有限,可以考慮使用流式處理工具。

5.4 示例

5.4.1 基本用法

import json

# Python 字典
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}

# 序列化為 JSON 字符串
json_str = json.dumps(data,ensure_ascii=False)

print(json_str) # {"name": "辰南", "age": 10028.26, "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]}

5.4.2 自定義序列化

如果 Python 對(duì)象中包含無法直接序列化的類型(如 datetime),可以使用default參數(shù)指定一個(gè)處理函數(shù):

import json
from datetime import datetime

def custom_serializer(obj):
    """
    自定義序列化函數(shù)
    :param obj:
    :return:
    """
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%d %H:%M:%S')  # 將 datetime 轉(zhuǎn)換為字符串
    raise TypeError("Type not serializable")

# Python 字典,包含 datetime 對(duì)象
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"],
    "created": datetime.now()
}

# 序列化為 JSON 字符串,indent:美化,ensure_ascii:輸出中文,sort_keys:排序
json_str = json.dumps(data, default=custom_serializer, indent=4, ensure_ascii=False, sort_keys=True)

print(json_str)

總結(jié) 

到此這篇關(guān)于Python JSON模塊loads、load、dump、dumps函數(shù)的文章就介紹到這了,更多相關(guān)Python JSON模塊loads、load、dump、dumps內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論