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

將Python數(shù)據(jù)類轉(zhuǎn)換為JSON的三種方法

 更新時間:2026年01月18日 14:05:08   作者:數(shù)研小生  
這篇文章主要介紹了在 Python 中把數(shù)據(jù)類(dataclass)以優(yōu)雅、規(guī)范的方式轉(zhuǎn)換成 JSON 格式的方法,這是數(shù)據(jù)處理場景中非常實用的需求,尤其貼合你作為數(shù)據(jù)服務(wù)商的技術(shù)工作場景,需要的朋友可以參考下

文章介紹在 Python 中把數(shù)據(jù)類(dataclass)以優(yōu)雅、規(guī)范的方式轉(zhuǎn)換成 JSON 格式的方法,這是數(shù)據(jù)處理場景中非常實用的需求,尤其貼合你作為數(shù)據(jù)服務(wù)商的技術(shù)工作場景。

Python 內(nèi)置的json模塊默認(rèn)無法直接序列化dataclass實例,下面我會提供三種從基礎(chǔ)到進(jìn)階的優(yōu)雅方案,覆蓋簡單場景、復(fù)用場景和生產(chǎn)級場景,代碼可直接復(fù)制使用。

方法 1:基礎(chǔ)優(yōu)雅方案(dataclasses.asdict + json.dumps)

這是官方推薦的基礎(chǔ)方案,通過dataclasses.asdict()將數(shù)據(jù)類實例轉(zhuǎn)為字典,再用json.dumps()序列化,適合簡單的非嵌套數(shù)據(jù)類。

import json
from dataclasses import dataclass, asdict
 
# 定義你的數(shù)據(jù)類(貼合數(shù)據(jù)服務(wù)場景:比如電商數(shù)據(jù)接口的返回數(shù)據(jù))
@dataclass
class EcommerceData:
    order_id: str          # 訂單ID
    user_id: int           # 用戶ID
    amount: float          # 訂單金額
    is_paid: bool          # 是否支付
 
# 創(chuàng)建數(shù)據(jù)類實例
data_instance = EcommerceData(
    order_id="ORD20260113001",
    user_id=10086,
    amount=299.99,
    is_paid=True
)
 
# 優(yōu)雅轉(zhuǎn)換為JSON
# 步驟1:轉(zhuǎn)字典 → 步驟2:序列化為JSON字符串(ensure_ascii=False支持中文,indent美化格式)
json_str = json.dumps(asdict(data_instance), ensure_ascii=False, indent=2)
 
# 輸出結(jié)果
print(json_str)

輸出結(jié)果

{
  "order_id": "ORD20260113001",
  "user_id": 10086,
  "amount": 299.99,
  "is_paid": true
}

關(guān)鍵解釋

  • asdict(data_instance):將 dataclass 實例轉(zhuǎn)為嵌套字典(支持嵌套 dataclass);
  • json.dumps()indent=2讓 JSON 格式更優(yōu)雅,ensure_ascii=False避免中文被轉(zhuǎn)義(數(shù)據(jù)服務(wù)中常處理中文數(shù)據(jù))。

方法 2:復(fù)用性更強的方案(自定義 JSON 編碼器)

如果需要多次序列化 dataclass,自定義JSONEncoder子類是更優(yōu)雅的方式,無需每次手動調(diào)用asdict()。

import json
from dataclasses import dataclass, is_dataclass, asdict
 
# 自定義JSON編碼器(自動識別dataclass并轉(zhuǎn)換)
class DataClassJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        # 如果是dataclass實例,自動轉(zhuǎn)字典
        if is_dataclass(obj):
            return asdict(obj)
        # 其他類型沿用默認(rèn)序列化邏輯
        return super().default(obj)
 
# 定義數(shù)據(jù)類(嵌套場景,更貼近真實數(shù)據(jù)服務(wù))
@dataclass
class UserInfo:
    name: str
    phone: str
 
@dataclass
class OrderData:
    order_id: str
    user: UserInfo  # 嵌套dataclass
    total: float
 
# 創(chuàng)建嵌套數(shù)據(jù)實例
nested_data = OrderData(
    order_id="ORD20260113002",
    user=UserInfo(name="張三", phone="13800138000"),
    total=599.0
)
 
# 直接序列化(指定自定義編碼器,無需手動轉(zhuǎn)字典)
json_str = json.dumps(
    nested_data,
    cls=DataClassJSONEncoder,  # 核心:指定自定義編碼器
    ensure_ascii=False,
    indent=2
)
 
print(json_str)

輸出結(jié)果

{
  "order_id": "ORD20260113002",
  "user": {
    "name": "張三",
    "phone": "13800138000"
  },
  "total": 599.0
}

關(guān)鍵解釋

  • 重寫JSONEncoderdefault方法,自動識別 dataclass 實例并轉(zhuǎn)換;
  • 支持嵌套 dataclass,更貼合數(shù)據(jù)服務(wù)中復(fù)雜數(shù)據(jù)結(jié)構(gòu)的場景;
  • 一次定義,多處復(fù)用,代碼更簡潔優(yōu)雅。

方法 3:生產(chǎn)級優(yōu)雅方案(使用 pydantic,推薦)

作為數(shù)據(jù)服務(wù)商,推薦使用pydantic庫(數(shù)據(jù)校驗 + JSON 序列化一體化),它的dataclass不僅支持一鍵轉(zhuǎn) JSON,還能自動校驗數(shù)據(jù)類型,避免臟數(shù)據(jù),是生產(chǎn)環(huán)境的首選。

步驟 1:安裝 pydantic

pip install pydantic 

步驟 2:代碼實現(xiàn)

from pydantic.dataclasses import dataclass  # 注意:是pydantic的dataclass
 
# 定義帶數(shù)據(jù)校驗的dataclass(數(shù)據(jù)服務(wù)核心需求:數(shù)據(jù)合法性)
@dataclass
class DataServiceResponse:
    code: int               # 狀態(tài)碼(必須是int)
    msg: str                # 提示信息(必須是str)
    data: dict              # 業(yè)務(wù)數(shù)據(jù)(必須是dict)
    timestamp: float = 0.0  # 時間戳(可選,默認(rèn)0.0)
 
# 創(chuàng)建實例
response = DataServiceResponse(
    code=200,
    msg="請求成功",
    data={"order_count": 100, "total_amount": 29999.5},
    timestamp=1736764800.0
)
 
# 一鍵優(yōu)雅轉(zhuǎn)JSON(無需額外處理,自帶格式化)
json_str = response.model_dump_json(indent=2, ensure_ascii=False)
 
print(json_str)

輸出結(jié)果

{
  "code": 200,
  "msg": "請求成功",
  "data": {
    "order_count": 100,
    "total_amount": 29999.5
  },
  "timestamp": 1736764800.0
}

關(guān)鍵解釋

  • pydantic.dataclass:自帶數(shù)據(jù)類型校驗(比如傳入code="200"會直接報錯,避免數(shù)據(jù)類型錯誤);
  • model_dump_json():一鍵序列化,無需手動轉(zhuǎn)字典,支持嵌套、默認(rèn)值、中文等;
  • 貼合數(shù)據(jù)服務(wù)商的核心需求:數(shù)據(jù)校驗 + JSON 序列化一體化,減少冗余代碼。

總結(jié)

  1. 核心思路:Python dataclass 轉(zhuǎn) JSON 的關(guān)鍵是先將實例轉(zhuǎn)為可序列化的字典(或 pydantic 結(jié)構(gòu)化數(shù)據(jù)),再進(jìn)行 JSON 序列化;
  2. 場景選擇:簡單場景用asdict()+json.dumps,復(fù)用場景用自定義JSONEncoder,生產(chǎn)環(huán)境優(yōu)先用pydantic(兼顧校驗和序列化);
  3. 數(shù)據(jù)服務(wù)適配pydantic方案不僅優(yōu)雅,還能校驗數(shù)據(jù)合法性,是數(shù)據(jù)服務(wù)商處理接口返回、數(shù)據(jù)傳輸?shù)淖顑?yōu)選擇。

以上就是將Python數(shù)據(jù)類轉(zhuǎn)換為JSON的三種方法的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)據(jù)類轉(zhuǎn)換為JSON的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Django中Pyecharts生成圖表實現(xiàn)

    在Django中Pyecharts生成圖表實現(xiàn)

    pyecharts是支持python的一種可視化,那么在Django中Pyecharts如何生成圖表,主要有兩種方法,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python字符串len()、split()、join()深度解析

    Python字符串len()、split()、join()深度解析

    在Python的字符串江湖中,len()、split()、join()三大方法如同倚天劍、屠龍刀、玄鐵重劍,看似簡單卻暗藏玄機,本文將通過實戰(zhàn)案例,帶您領(lǐng)略這些方法的精妙之處,需要的朋友可以參考下
    2025-04-04
  • Python和JS反爬之解決反爬參數(shù)?signKey

    Python和JS反爬之解決反爬參數(shù)?signKey

    這篇文章主要介紹了Python和JS反爬之解決反爬參數(shù)?signKey,Python?反爬中有一大類,叫做字體反爬,核心的理論就是通過字體文件或者?CSS?偏移,接下來文章的詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 在python中路徑含有空格的問題及解決

    在python中路徑含有空格的問題及解決

    這篇文章主要介紹了在python中路徑含有空格的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python @propert裝飾器使用方法原理解析

    python @propert裝飾器使用方法原理解析

    這篇文章主要介紹了python @propert裝飾器使用方法原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Python代碼打包為exe的六種主流方法及避坑指南

    Python代碼打包為exe的六種主流方法及避坑指南

    在 Python 開發(fā)中,我們常遇到這樣的需求:將寫好的腳本分享給他人,但對方?jīng)]有安裝 Python 環(huán)境,也不懂如何配置依賴,此時,將 Python 代碼打包成exe就成了最佳解決方案,本文將詳細(xì)講解 6 種主流的 Python 打包工具,需要的朋友可以參考下
    2025-11-11
  • 一文講清Python中文件路徑的基本概念與操作方法

    一文講清Python中文件路徑的基本概念與操作方法

    這篇文章主要為大家詳細(xì)介紹了Python中文件路徑的基本概念與操作方法,其中文件路徑主要分為絕對路徑(從根目錄開始)和相對路徑(相對于當(dāng)前工作目錄),感興趣的小伙伴可以了解下
    2026-04-04
  • python解決js文件utf-8編碼亂碼問題(推薦)

    python解決js文件utf-8編碼亂碼問題(推薦)

    這篇文章主要介紹了python解決js文件utf-8編碼亂碼問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • Python獲取excel內(nèi)容及相關(guān)操作代碼實例

    Python獲取excel內(nèi)容及相關(guān)操作代碼實例

    這篇文章主要介紹了Python獲取excel內(nèi)容及相關(guān)操作代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python繪制數(shù)據(jù)動態(tài)圖的方法詳解

    Python繪制數(shù)據(jù)動態(tài)圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語言繪制好看的數(shù)據(jù)動態(tài)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-07-07

最新評論

周口市| 新昌县| 江都市| 九龙坡区| 都匀市| 沂水县| 焉耆| 财经| 乳山市| 昌宁县| 商河县| 江都市| 榆中县| 米林县| 青浦区| 福州市| 镇雄县| 岗巴县| 高雄县| 铜陵市| 双牌县| 正安县| 彝良县| 商洛市| 林芝县| 罗定市| 桂阳县| 吴江市| 乡宁县| 丹寨县| 漳平市| 石景山区| 塘沽区| 台南市| 罗平县| 安远县| 木兰县| 宜宾市| 嵊泗县| 定兴县| 进贤县|