0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python之对象和json互相转换

冬至配饺子 来源:缪斯之子 作者:肖新苗 2022-08-23 10:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.转换:对象与json

import json
from typing import Dict


class Person:
def __init__(self, name: str = 'xiaomiao'):
self.name = name

@staticmethod
def to_dict(obj: 'Person'):
return obj.__dict__

@classmethod
def from_dict(cls, dict: Dict)->'Person':
p = cls()
p.__dict__ = dict
return p


class Female(Person):
def __init__(self, name: str = 'xiao', sex: int = 1):
self.name = name
self.sex = sex


def test_1():
p = Person('xiao')
json1 = json.dumps(p, default=Person.to_dict)
assert '{"name": "xiao"}' == json1, 'json dump error'
p2 = json.loads(json1, object_hook=Person.from_dict)
assert p.__dict__ == p2.__dict__, 'json loads error'


def test_2():
p_list = [Person('xiao1'), Person('xiao2')]
json1 = json.dumps(p_list, default=Person.to_dict)
assert '[{"name": "xiao1"}, {"name": "xiao2"}]' == json1, 'json dump 2 error'
p2_list = json.loads(json1, object_hook=Person.from_dict)
assert p_list[0].__dict__ == p2_list[0].__dict__ and p_list[1].__dict__ == p2_list[1].__dict__, 'json loads 2 error'


def test_3():
p = Female(name='xiao1', sex=1)
json1 = json.dumps(p, default=Female.to_dict)
assert '{"name": "xiao1", "sex": 1}' == json1, 'json dump error'
p2 = json.loads(json1, object_hook=Female.from_dict)
assert p.__dict__ == p2.__dict__, 'json loads error'

2.转换:对象集合与json列表

import importlib
import json
from typing import Dict


class Person1:
def __init__(self, name: str = 'xiao'):
self.name = name


class Person:
def __init__(self, name: str = 'good'):
self.name = name
self.p1:Person1 = None

@staticmethod
def to_dict_pure(obj: 'Person'):
return obj.__dict__

@staticmethod
def to_dict(obj: 'Person'):
obj.__dict__.update(
{'fullname': f'{obj.__module__}.{obj.__class__.__name__}'})
return obj.__dict__

@staticmethod
def from_dict(dict: Dict)->'Person':
module, classname = dict['fullname'].rsplit('.', 1)
p = getattr(importlib.import_module(module), classname)()
p.__dict__ = dict
return p


def test_1():
p = Person('xiao')
p.p1 = Person1('xinmiao')
json1 = json.dumps(p, default=Person.to_dict)
assert '{"name": "xiao", "p1": {"name": "xinmiao", "fullname": "test_obj_conv_2.Person1"}, ' +\
'"fullname": "test_obj_conv_2.Person"}' == json1, 'json dumps error'
p2 = json.loads(json1, object_hook=Person.from_dict)
assert p.__dict__['name'] == p2.__dict__['name'] \
and p.__dict__['p1'].__dict__ == p2.__dict__['p1'].__dict__, 'json loads error'


def test_2():
p1 = Person('xiao1')
p1.p1 = Person1('xin1')
p2 = Person('xiao2')
p2.p1 = Person1('xin2')
p_list = [p1, p2]
json1 = json.dumps(p_list, default=Person.to_dict)
assert '[{"name": "xiao1", "p1": {"name": "xin1", "fullname": "test_obj_conv_2.Person1"},' +\
' "fullname": "test_obj_conv_2.Person"}, {"name": "xiao2", "p1": {"name": "xin2", ' +\
'"fullname": "test_obj_conv_2.Person1"}, "fullname": "test_obj_conv_2.Person"}]', 'json dumps 2 error'
p2_list = json.loads(json1, object_hook=Person.from_dict)
assert p_list[0].__dict__['name'] == p2_list[0].__dict__['name'] \
and p_list[0].__dict__['p1'].__dict__ == p2_list[0].__dict__['p1'].__dict__ \
and p_list[1].__dict__['name'] == p2_list[1].__dict__['name'] \
and p_list[1].__dict__['p1'].__dict__ == p2_list[1].__dict__['p1'].__dict



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89588
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7623
  • JSON
    +关注

    关注

    0

    文章

    125

    浏览量

    7704
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解析淘宝拍立淘按图搜索API接口与JSON数据示例参考

    应用。 获取API权限和密钥(App Key、App Secret)。 使用Python调用API的示例代码。 3. JSON数据示例与解析 返回的JSON数据结构解析。 如何提取关键信息(如商品ID、名称、价格、图片等)。 4
    的头像 发表于 11-11 13:19 119次阅读

    harmony-utilsJSONUtil,JSON工具类

    harmony-utilsJSONUtil,JSON工具类 harmony-utils 简介与说明 harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类
    的头像 发表于 07-03 18:21 359次阅读

    harmony-utilsTempUtil,温度转换工具类

    harmony-utilsTempUtil,温度转换工具类 harmony-utils 简介与说明 [harmony-utils] 一款功能丰富且极易上手的HarmonyOS工具库,借助众多
    的头像 发表于 06-26 00:50 314次阅读

    迅为RK3568开发板编写bundle.json文件

    bundle.json 文件内容如下所示: 下面是对各个字段的解释: name: \"@ohos/demos\" - 这是组件或项目的名称,这里表示它属于 OHOS
    发表于 06-05 15:38

    将预先训练的固态盘MobileNetV2模型转换为IR,在运行替换器“REPLACEMENT_ID”时发生异常错误怎么解决?

    将预先训练的固态盘 MobileNetV2 模型转换为 IR,但无法转换经过自定义训练的模型。 导出的冻结模型图:python object_detection
    发表于 03-07 08:01

    如何使用命令将更快的R ACCENT-10.onnx模型转换为IR?

    使用命令将更快的R ACCENT-10.onnx 模型转换为 IR:python ./mo_onnx.py --input_model FasterRCNN-10.onnx
    发表于 03-07 07:43

    无法转换TF OD API掩码RPGA模型怎么办?

    无法转换重新训练的 TF OD API 掩码 RPGA 模型,该模型使用以下命令在 GPU 上工作: mo > --saved_model_dir
    发表于 03-06 06:44

    使用Yolo-v3-TF运行OpenVINO™对象检测Python演示时的结果不准确的原因?

    通过模型下载器下载了 yolo-v3-tf: ./downloader.py --name yolo-v3-tf 通过模型 优化器转换模型: python3 ./model_optimizer
    发表于 03-06 06:31

    为什么无法使用OpenVINO™模型优化器转换TensorFlow 2.4模型?

    已下载 ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8 型号。 使用将模型转换为中间表示 (IR) ssd_support_api_v.2.4.json
    发表于 03-05 09:07

    无法在Windows Subsystem for Linux 2上使用对象检测Python演示运行YoloV4模型?

    在 WSL2 上运行对象检测 python 演示。 使用 CPU 运行 object_detection_demo.py 时遇到错误: OpenCV: FFMPEG: tag
    发表于 03-05 08:43

    在深度学习工作台中安装Python软件包报错怎么解决?

    在 DL 工作台中导入的模型。 在准备将导入的模型转换为中间表示 (IR) 时收到错误: Cannot install packages for python /home/workbench/.workbench/environments/2/bin/
    发表于 03-05 07:32

    对象存储是什么结构类型?

    对象存储属于非结构化数据存储架构,采用扁平化命名空间结构。其核心通过唯一标识符(ObjectID)定位数据对象,突破传统文件系统的层级目录限制,形成"桶-对象"两级逻辑模型。数据以独立对象
    的头像 发表于 02-10 11:14 693次阅读

    OSS Nokalva:适用于Python的OSS NAS工具

    有助于将符合 3GPP 技术规范 24.301 和 24.501 的 NAS 消息与 XML 和 JSON 格式进行转换。这些工具可在 Windows 和 Linux 平台上使用。使用 OSS
    的头像 发表于 02-09 09:16 778次阅读
    OSS Nokalva:适用于<b class='flag-5'>Python</b>的OSS NAS工具

    think-cell——使用JSON数据实现自动化(一)

    您可以使用 JSON 中的数据来复制最初作为模板创建的图表,并为其提供新的数据表。您可以控制使用特定模板构建新演示文稿的顺序。模板也可以多次使用。 PowerPoint 模板和 JSON 数据都可以
    的头像 发表于 01-02 13:37 729次阅读
    think-cell——使用<b class='flag-5'>JSON</b>数据实现自动化(一)

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据

    使用分布式数据对象迁移数据,当需要迁移的数据较大(100KB以上)或需要迁移文件时,可以使用分布式数据对象。原理与接口说明详见分布式数据对象跨设备数据同步。 说明:自API 12起,由于直接使用跨
    发表于 12-24 09:40