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
    +关注

    关注

    56

    文章

    4801

    浏览量

    84862
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7260
  • JSON
    +关注

    关注

    0

    文章

    119

    浏览量

    6985
收藏 人收藏

    评论

    相关推荐

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

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

    实例篇 4G模组软件json数据处理!

    今天我会把4G模组软件的json数据处理整理成文,以低功耗模组Air780E为例,一一展示出来:
    的头像 发表于 11-12 12:17 231次阅读

    Python库解析:通过库实现代理请求与数据抓取

    Python中,有多个库可以帮助你实现代理请求和数据抓取。这些库提供了丰富的功能和灵活的API,使得你可以轻松地发送HTTP请求、处理响应、解析HTML/XML/JSON数据,以及进行复杂的网络操作。
    的头像 发表于 10-24 07:54 204次阅读

    JSON协议是什么,物联网中的RTU中如何使用JSON协议和服务器交互

    一 概述 1.1 什么是 JSON JSON是JavaScript Object Notation的简称,中文含义为“JavaScript 对象表示法”,它是一种数据交换的文本格式,而不是一种编程
    的头像 发表于 09-25 16:14 950次阅读
    <b class='flag-5'>JSON</b>协议是什么,物联网中的RTU中如何使用<b class='flag-5'>JSON</b>协议和服务器交互

    如何利用python和API查询IP地址?

    Python中,直接查询IP地址的地理位置或详细信息(如所属国家、城市等)通常需要依赖外部API服务,因为Python标准库本身不提供直接查询IP地址地理位置的功能。以下是一个使用requests
    发表于 08-28 11:55

    pytorch和python的关系是什么

    在当今的人工智能领域,Python已经成为了最受欢迎的编程语言之一。Python的易学易用、丰富的库和框架以及强大的社区支持,使其成为了数据科学、机器学习和深度学习等领域的首选语言。而在深度学习领域
    的头像 发表于 08-01 15:27 2124次阅读

    Python建模算法与应用

    Python作为一种功能强大、免费、开源且面向对象的编程语言,在科学计算、数学建模、数据分析等领域展现出了卓越的性能。其简洁的语法、对动态输入的支持以及解释性语言的本质,使得Python在多个平台
    的头像 发表于 07-24 10:41 605次阅读

    python训练出的模型怎么调用

    使用pickle模块 pickle 是Python的一个内置模块,用于序列化和反序列化Python对象结构。使用 pickle 可以方便地保存和加载模型。 import pickle # 保存模型
    的头像 发表于 07-11 10:15 2124次阅读

    神经网络的基本原理及Python编程实现

    神经网络作为深度学习算法的基本构建模块,模拟了人脑的行为,通过互相连接的节点(也称为“神经元”)实现对输入数据的处理、模式识别和结果预测等功能。本文将深入探讨神经网络的基本原理,并结合Python编程实现进行说明。
    的头像 发表于 07-03 16:11 724次阅读

    Labview与Halcon图片Image互相转换

    Labview 与Halcon 联合开发 分享一下Labview 与Halcon Image格式相互转换的程序, 整理了一个VI,LV_to _Halconxl.vi,可以直接调用,相互转换两种格式
    发表于 06-27 23:00

    微软Windows 10/11系统新增PowerToys AI高级粘贴功能

    以C++到Python的转化为例,只需轻松复制一段C++代码,再按下特定快捷键即可完成自动化转换。此外,微软还在Build 2024开发者大会上展示了如何利用PowerToys将XML快速转换
    的头像 发表于 05-28 10:39 726次阅读

    PLC设备通过智能网关采用HTTP协议JSON文件对接MES、ERP等系统平台

    ,字符可自由修改,举例只是为了描述各种JSON文件的结构实现。MQTT协议的发布/订阅也是同样的对应方式。具体如下: 多个Key:Value的同级组合: 包含子对象: 增加时间戳,多种格式可以
    发表于 05-13 12:04

    python解析netflow数据到csv的流程详解

    本文主要讲解了linux下通过tcpdump抓取netflow数据包,并将其导入到wireshark进行解析,然后通过wireshark导出数据为json文件,再通过python脚本将其解析为csv文件以便做数据分析。
    的头像 发表于 05-01 11:18 698次阅读
    <b class='flag-5'>python</b>解析netflow数据到csv的流程详解

    python中open函数的用法详解

    python中open函数的用法详解 Python中的open()函数用于打开文件。它接受文件名和模式作为参数,并返回一个文件对象。文件对象可用于读取、写入和管理文件。 open()函
    的头像 发表于 01-30 15:31 2188次阅读

    PLC从HTTP服务端获取JSON文件,解析数据到寄存器

    智能网关IGT-DSER集成了多种PLC协议,方便实现各种PLC与HTTP服务端之间通讯。通过网关的参数配置软件绑定JSON文件的字段与PLC寄存器地址,配置URL,即可采用POST命令,将JSON
    发表于 01-24 09:47