最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python處理JSON的四大函數(shù)全解析(load/loads/dump/dumps)

 更新時(shí)間:2025年10月13日 08:56:56   作者:雨夜的星光  
在現(xiàn)代軟件開發(fā)中,JSON?已成為數(shù)據(jù)交換的通用語言,對(duì)于許多初學(xué)者來說,load、loads、dump、dumps?這四個(gè)核心函數(shù)似乎總是有點(diǎn)令人困惑,下面小編就為大家詳細(xì)介紹一下吧

在現(xiàn)代軟件開發(fā)中,JSON (JavaScript Object Notation) 已成為數(shù)據(jù)交換的通用語言。無論是與 Web API 通信、存儲(chǔ)應(yīng)用程序配置,還是在不同服務(wù)間傳遞信息,JSON 的身影無處不在。Python 憑借其強(qiáng)大的標(biāo)準(zhǔn)庫(kù),內(nèi)置了功能完備的 json 模塊來應(yīng)對(duì)這一切。

然而,對(duì)于許多初學(xué)者來說,load、loads、dump、dumps 這四個(gè)核心函數(shù)似乎總是有點(diǎn)令人困惑。它們的名字如此相似,功能又各有側(cè)重。本文將徹底厘清它們的區(qū)別,從基礎(chǔ)用法到高級(jí)技巧,在處理 JSON 數(shù)據(jù)時(shí)游刃有余。

一、核心法則:解密神秘的s后綴

要掌握這四個(gè)函數(shù),我們首先要理解一個(gè)最關(guān)鍵的區(qū)別:函數(shù)名末尾的 s

這里的 s 代表 string (字符串)。

  • 帶 s 的函數(shù) (loads, dumps): 它們操作的對(duì)象是內(nèi)存中的 Python 字符串。
  • 不帶 s 的函數(shù) (load, dump): 它們操作的對(duì)象是 文件(或類文件)對(duì)象,負(fù)責(zé)數(shù)據(jù)的讀寫。

記住這個(gè)“黃金法則”,就已經(jīng)掌握了它們一半的奧秘。接下來,圍繞兩大核心操作——序列化反序列化來展開。

1、序列化:將 Python 對(duì)象轉(zhuǎn)換為 JSON

序列化(也稱編碼)是將 Python 對(duì)象(如字典或列表)轉(zhuǎn)換為 JSON 格式的過程。

1.1 json.dumps(): 轉(zhuǎn)換成 JSON字符串

當(dāng)需要將一個(gè) Python 對(duì)象變成一個(gè) JSON 格式的字符串,以便通過網(wǎng)絡(luò)發(fā)送或在程序中進(jìn)一步處理時(shí),dumps() 是不二之選。

import json

# 一個(gè) Python 字典
data = {
    "name": "張三",
    "age": 30,
    "courses": ["數(shù)學(xué)", "英語"]
}

# 轉(zhuǎn)換為 JSON 字符串
# ensure_ascii=False 確保中文字符正常顯示
# indent=4 讓輸出格式更美觀
json_string = json.dumps(data, ensure_ascii=False, indent=4)

print("轉(zhuǎn)換后的 JSON 字符串:")
print(json_string)
print("\n類型是:", type(json_string))

運(yùn)行結(jié)果:

1.2 json.dump(): 寫入到 JSON文件

當(dāng)需要將數(shù)據(jù)持久化存儲(chǔ),例如保存配置文件或程序狀態(tài)時(shí),dump() 可以直接將 Python 對(duì)象寫入文件中。

import json

data = {
    "name": "李四",
    "age": 25,
    "courses": ["數(shù)學(xué)", "英語"]
}

# 'w' 表示寫入模式,encoding='utf-8' 支持中文
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

print("數(shù)據(jù)已成功寫入 data.json 文件。")

1.3ensure_ascii 詳解

ensure_ascii 是 json.dump() 和 json.dumps() 函數(shù)中的一個(gè)布爾類型參數(shù),它控制著輸出結(jié)果中如何處理非 ASCII 字符(例如中文、日文、特殊符號(hào)等)。

當(dāng)調(diào)用 json.dumps()json.dump() 而不指定 ensure_ascii 參數(shù)時(shí),它默認(rèn)為 True。在這種模式下,所有非 ASCII 字符都會(huì)被“轉(zhuǎn)義”成 \uXXXX 的形式。\uXXXX 是一種 Unicode 轉(zhuǎn)義序列。這種做法的初衷是為了保證最大的兼容性。因?yàn)?ASCII 編碼是計(jì)算機(jī)世界里最基礎(chǔ)、最通用的字符集,任何系統(tǒng)都可以無誤地處理純 ASCII 文本。通過將所有特殊字符轉(zhuǎn)換為 ASCII 范圍內(nèi)的 \u 序列,可以確保生成的 JSON 字符串在任何環(huán)境下(即使是那些不支持 UTF-8 的老舊系統(tǒng))都能被安全地傳輸和存儲(chǔ),不會(huì)產(chǎn)生編碼錯(cuò)誤或亂碼。

推薦:當(dāng)明確地將 ensure_ascii 設(shè)置為 False 時(shí),是在告訴 json 模塊:“請(qǐng)不要轉(zhuǎn)義這些非 ASCII 字符,直接將它們?cè)瓨虞敵觥?rdquo;

注意:當(dāng)使用 ensure_ascii=False 并且要將結(jié)果寫入文件 (json.dump()) 時(shí),有一個(gè)非常重要的配套操作:必須在 open() 函數(shù)中指定編碼,通常是 encoding='utf-8'ensure_ascii=False 產(chǎn)生了包含原生非 ASCII 字符的輸出。如果不指定編碼,Python 可能會(huì)使用操作系統(tǒng)的默認(rèn)編碼(在某些 Windows 系統(tǒng)上可能是 GBK 或 CP936)來嘗試寫入文件。此時(shí)如果字符(比如某些特殊符號(hào)或生僻字)不在該默認(rèn)編碼范圍內(nèi),程序就會(huì)拋出 UnicodeEncodeError 錯(cuò)誤。

在今天,UTF-8 已經(jīng)成為事實(shí)上的標(biāo)準(zhǔn)。因此,在 Python 項(xiàng)目中,強(qiáng)烈推薦始終使用 ensure_ascii=False 并配合 encoding='utf-8' 來處理 JSON 數(shù)據(jù)。這會(huì)讓數(shù)據(jù)文件更易于管理、調(diào)試,也更節(jié)省空間。

2、反序列化:將 JSON 解析為 Python 對(duì)象

2.1 json.loads(): 從 JSON字符串中加載

從 API 響應(yīng)或消息隊(duì)列中收到一個(gè) JSON 格式的字符串時(shí),loads() 會(huì)將其解析為 Python 的字典或列表。

import json

json_string = '''
{
    "name": "王五",
    "isAlive": true,
    "hobbies": ["籃球", "游戲"]
}
'''

# 從字符串加載
python_dict = json.loads(json_string)

print("轉(zhuǎn)換后的 Python 字典:")
print(python_dict)
print("\n類型是:", type(python_dict))
print("姓名是:", python_dict["name"])

運(yùn)行結(jié)果:

2.2 json.load(): 從 JSON文件中讀取

當(dāng)需要從一個(gè)配置文件(如 user_data.json)中讀取數(shù)據(jù)并加載到程序中時(shí),load() 是最直接的方法。

import json

# 'r' 表示讀取模式,encoding='utf-8' 支持中文
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

print("從文件讀取的數(shù)據(jù):")
print(data)
print("\n類型是:", type(data))
print("課程是:", data["courses"])

3、表格對(duì)比

函數(shù)操作輸入輸出主要用途
json.dumps()序列化Python 對(duì)象JSON 格式的字符串網(wǎng)絡(luò)傳輸、內(nèi)存處理
json.dump()序列化Python 對(duì)象 + 文件對(duì)象None (寫入文件)數(shù)據(jù)持久化、保存配置
json.loads()反序列化JSON 格式的字符串Python 對(duì)象解析 API 響應(yīng)、文本數(shù)據(jù)
json.load()反序列化文件對(duì)象Python 對(duì)象從文件加載配置或數(shù)據(jù)

二、超越基礎(chǔ):json模塊的進(jìn)階工具

上述四個(gè)函數(shù)能滿足 99% 的需求,同時(shí)在某些特殊場(chǎng)景下,json 模塊還提供了更強(qiáng)大的工具:

1、處理自定義對(duì)象 (JSONEncoder)

當(dāng)試圖序列化一個(gè) Python 自定義對(duì)象(比如一個(gè)類的實(shí)例)時(shí),json.dumps() 默認(rèn)是不知道如何處理的,會(huì)拋出 TypeError。為了解決這個(gè)問題,json 模塊提供了 JSONEncoderJSONDecoder 類。

json.JSONEncoder: 你可以通過繼承這個(gè)類并重寫 default() 方法,來告訴 dumps 如何處理你自定義的數(shù)據(jù)類型。場(chǎng)景示例:你想將一個(gè)包含 datetime 對(duì)象的字典序列化,但 JSON 標(biāo)準(zhǔn)里沒有日期時(shí)間類型。

import json
from datetime import datetime

# 默認(rèn)情況下,這會(huì)報(bào)錯(cuò)
# data = {'name': 'test', 'time': datetime.now()}
# json.dumps(data) # TypeError: Object of type datetime is not JSON serializable

# 使用自定義 Encoder
class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            # 將 datetime 對(duì)象格式化為字符串
            return obj.isoformat()
        # 其他類型調(diào)用父類的默認(rèn)處理方法
        return super().default(obj)

data = {'name': 'test', 'time': datetime.now()}
json_string = json.dumps(data, cls=DateTimeEncoder, indent=4)
print(json_string)
# 輸出:
# {
#     "name": "test",
#     "time": "2025-10-06T22:01:28.123456"
# }

json.JSONDecoder: 與上面對(duì)應(yīng),可以通過繼承這個(gè)類,使用 object_hook 參數(shù)來定義如何將特定的 JSON 數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換回自定義的 Python 對(duì)象。

import json
from datetime import datetime

def datetime_decoder_hook(json_dict):
    """
    一個(gè)用于 json.loads 的 object_hook 函數(shù)。
    它會(huì)檢查字典中的值,嘗試將符合 ISO 8601 格式的字符串轉(zhuǎn)換回 datetime 對(duì)象。
    """
    for key, value in json_dict.items():
        # 檢查值是否為字符串,并嘗試進(jìn)行轉(zhuǎn)換
        if isinstance(value, str):
            try:
                # 嘗試用 fromisoformat 解析
                # Python 3.7+ 支持解析帶 Z 和微秒的完整 ISO 格式
                json_dict[key] = datetime.fromisoformat(value)
            except (ValueError, TypeError):
                # 如果轉(zhuǎn)換失?。ㄕf明它不是我們想要的日期格式),則保持原樣
                pass
    return json_dict

# 1. 準(zhǔn)備一個(gè)包含 ISO 日期格式字符串的 JSON
json_string = """
{
    "name": "test_event",
    "user_id": 123,
    "created_at": "2025-10-06T22:01:28.123456",
    "metadata": {
        "source": "api",
        "processed_at": "2025-10-07T10:55:00.543210"
    }
}
"""

# 2. 使用 object_hook 進(jìn)行解碼
data_with_datetime = json.loads(json_string, object_hook=datetime_decoder_hook)

# 3. 驗(yàn)證結(jié)果
print("解碼后的 Python 對(duì)象:")
print(data_with_datetime)
print("\n--- 類型驗(yàn)證 ---")
print(f"'created_at' 的類型是: {type(data_with_datetime['created_at'])}")
print(f"'processed_at' 的類型是: {type(data_with_datetime['metadata']['processed_at'])}")
print(f"'name' 的類型是: {type(data_with_datetime['name'])}")

運(yùn)行結(jié)果:

直接使用 object_hook 參數(shù)通常是最簡(jiǎn)單直接的方式。但如果想創(chuàng)建一個(gè)可重用的、配置更復(fù)雜的解碼器,或者在某個(gè)類中封裝解碼邏輯,也可以選擇繼承 json.JSONDecoder

import json
from datetime import datetime

class CustomDateTimeDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        # 將我們的鉤子函數(shù)綁定到解碼器實(shí)例上
        json.JSONDecoder.__init__(self, object_hook=self.datetime_hook, *args, **kwargs)

    def datetime_hook(self, json_dict):
        for key, value in json_dict.items():
            if isinstance(value, str):
                try:
                    json_dict[key] = datetime.fromisoformat(value)
                except (ValueError, TypeError):
                    pass
        return json_dict

# 使用自定義的解碼器類
json_string = '{"name": "test", "time": "2025-10-06T22:01:28.123456"}'

# 通過 cls 參數(shù)傳入自定義的解碼器類
data = json.loads(json_string, cls=CustomDateTimeDecoder)

print(data)
print(f"time 字段的類型是: {type(data['time'])}")

2、健壯的錯(cuò)誤處理 (JSONDecodeError):

當(dāng)解析格式錯(cuò)誤的 JSON 時(shí),程序會(huì)拋出 json.JSONDecodeError。在生產(chǎn)環(huán)境中,應(yīng)該使用 try...except 塊來捕獲這個(gè)異常,避免程序因此崩潰。

場(chǎng)景示例:從一個(gè) API 獲取了一段不完整的 JSON 字符串。

import json

invalid_json = '{"name": "John", "age": 30,' # 注意這里缺少了結(jié)尾的 '}'

try:
    data = json.loads(invalid_json)
except json.JSONDecodeError as e:
    print(f"JSON 解析失敗: {e}")
    # 輸出: JSON 解析失敗: Unexpected end of document: line 1 column 29 (char 28)

3、便捷的命令行工具(json.tool):

Python 提供了一個(gè)方便的命令行工具,可以快速驗(yàn)證 JSON 文件的合法性并將其格式化輸出。只需在終端運(yùn)行 python -m json.tool your_file.json 即可。

三、總結(jié)

功能分類主要成員用途使用頻率
核心功能load, loads, dump, dumps在 Python 對(duì)象和 JSON 之間進(jìn)行轉(zhuǎn)換(文件/字符串)非常高 (99%)
高級(jí)定制JSONEncoder, JSONDecoder處理非標(biāo)準(zhǔn)/自定義數(shù)據(jù)類型的序列化和反序列化較低
錯(cuò)誤處理JSONDecodeError捕獲和處理格式錯(cuò)誤的 JSON 數(shù)據(jù)

中等(在生產(chǎn)代碼中很重要)

命令行工具json.tool從命令行快速驗(yàn)證和格式化 JSON 文件

偶爾(對(duì)開發(fā)者調(diào)試很有用)

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

相關(guān)文章

  • Python模塊搜索概念介紹及模塊安裝方法介紹

    Python模塊搜索概念介紹及模塊安裝方法介紹

    這篇文章主要介紹了Python模塊搜索概念介紹及模塊安裝方法介紹,本文詳細(xì)講解了import模塊的運(yùn)作原理,搜索路徑的過程以及模塊安裝的多種方法,需要的朋友可以參考下
    2015-06-06
  • Python基于高斯消元法計(jì)算線性方程組示例

    Python基于高斯消元法計(jì)算線性方程組示例

    這篇文章主要介紹了Python基于高斯消元法計(jì)算線性方程組,結(jié)合實(shí)例形式分析了Python高斯消元法針對(duì)方程組求解的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Django DRF APIView源碼運(yùn)行流程詳解

    Django DRF APIView源碼運(yùn)行流程詳解

    這篇文章主要介紹了Django DRF APIView源碼運(yùn)行流程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳談python3中用for循環(huán)刪除列表中元素的坑

    詳談python3中用for循環(huán)刪除列表中元素的坑

    下面小編就為大家分享一篇詳談python3中用for循環(huán)刪除列表中元素的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python之根據(jù)輸入?yún)?shù)計(jì)算結(jié)果案例講解

    Python之根據(jù)輸入?yún)?shù)計(jì)算結(jié)果案例講解

    這篇文章主要介紹了Python之根據(jù)輸入?yún)?shù)計(jì)算結(jié)果案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解Python中的整除運(yùn)算及其應(yīng)用場(chǎng)景

    詳解Python中的整除運(yùn)算及其應(yīng)用場(chǎng)景

    在Python編程中,整除運(yùn)算(也稱為整商運(yùn)算)是一個(gè)常見的操作,它用于計(jì)算兩個(gè)數(shù)相除后的整數(shù)部分,下面就跟隨小編一起來了解一下它的語法,工作原理和實(shí)際應(yīng)用案例吧
    2024-11-11
  • Python進(jìn)程池基本概念

    Python進(jìn)程池基本概念

    這篇文章主要介紹了Python進(jìn)程池基本概念,當(dāng)創(chuàng)建的子進(jìn)程數(shù)量不多時(shí),可以直接利用多處理進(jìn)程中的進(jìn)程動(dòng)態(tài)形成需要的進(jìn)程,下文關(guān)于Python線程池的概念做詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • Python項(xiàng)目Docker倉(cāng)庫(kù)發(fā)布指南

    Python項(xiàng)目Docker倉(cāng)庫(kù)發(fā)布指南

    本文檔詳細(xì)介紹如何將 AI Backend Python 項(xiàng)目構(gòu)建為 Docker 鏡像并發(fā)布到各種 Docker 倉(cāng)庫(kù),包括 Docker Hub、阿里云容器鏡像服務(wù)、騰訊云容器鏡像服務(wù)等,需要的朋友可以參考下
    2025-08-08
  • 用Python實(shí)現(xiàn)局域網(wǎng)控制電腦

    用Python實(shí)現(xiàn)局域網(wǎng)控制電腦

    大家好,本篇文章主要講的是用Python實(shí)現(xiàn)局域網(wǎng)控制電腦,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Python enumerate函數(shù)功能與用法示例

    Python enumerate函數(shù)功能與用法示例

    這篇文章主要介紹了Python enumerate函數(shù)功能與用法,結(jié)合實(shí)例形式分析了enumerate函數(shù)針對(duì)列表、字符串遍歷操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-03-03

最新評(píng)論

来凤县| 深水埗区| 镇巴县| 侯马市| 镇坪县| 嘉善县| 江西省| 双峰县| 宜兰县| 朝阳市| 南丹县| 临邑县| 东山县| 宁安市| 东兴市| 合水县| 衡山县| 彭州市| 栾城县| 达孜县| 扶沟县| 呼图壁县| 潜山县| 同仁县| 上饶市| 大安市| 香港 | 团风县| 屯昌县| 沈阳市| 通州区| 临夏市| 康定县| 建始县| 山东| 砀山县| 崇仁县| 泊头市| 阿城市| 柳州市| 灌阳县|