python dataclass与dataclass_json修饰器的理解

python dataclass及dataclass_json修饰器的理解


dataclass可用于自动生成类的魔术方法
dataclass_json可以用于将json格式数据转化为类的实例变量
dataclass_json必须结合dataclass使用
dataclass_json可以通过添加类型注释和循环定义,实现深层json调用

实例:

from dataclasses import dataclass
from dataclasses_json import dataclass_json
from typing import Any, Dict, List, Tuple

@dataclass_json
@dataclass
class Nn:
    xycoords: str

@dataclass_json
@dataclass
class Station:
    stations: Tuple[Nn, ...]

@dataclass_json
@dataclass
class Busline_list:
    busline_list: Tuple[Station, ...]

@dataclass_json
@dataclass
class Data:
    data: Tuple[Busline_list, ...]

with open("test.json", "r", encoding="utf-8") as fp:
    a = Data.from_json(fp.read())

结果:
Data(data=(Busline_list(busline_list=(Station(stations=(Nn(xycoords=‘1’), Nn(xycoords=‘2’))), Station(stations=(Nn(xycoords=‘3’), Nn(xycoords=‘4’))))), Busline_list(busline_list=(Station(stations=(Nn(xycoords=‘5’), Nn(xycoords=‘6’))), Station(stations=(Nn(xycoords=‘7’), Nn(xycoords=‘8’)))))))


可以发现递归调用了所有定义的类,将json文件全部解析为定义的类型


假如将上述代码修改为以下:

from dataclasses import dataclass
from dataclasses_json import dataclass_json
from typing import Any, Dict, List, Tuple

@dataclass_json
@dataclass
class Nn:
    xycoords: str

@dataclass_json
@dataclass
class Station:
    stations: Tuple[Nn, ...]

@dataclass_json
@dataclass
class Busline_list:
    busline_list: Tuple[int, ...]  # 将Station改为int

@dataclass_json
@dataclass
class Data:
    data: Tuple[Busline_list, ...]

with open("test.json", "r", encoding="utf-8") as fp:
    a = Data.from_json(fp.read())

结果为:
Data(data=(Busline_list(busline_list=({‘stations’: [{‘xycoords’: ‘1’}, {‘xycoords’: ‘2’}]}, {‘stations’: [{‘xycoords’: ‘3’}, {‘xycoords’: ‘4’}]})), Busline_list(busline_list=({‘stations’: [{‘xycoords’: ‘5’}, {‘xycoords’: ‘6’}]}, {‘stations’: [{‘xycoords’: ‘7’}, {‘xycoords’: ‘8’}]}))))


发现最终只递归到busline_list这一类,没有对json进行进一步深层次的解析

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值