就像标题所说的那样,我正在尝试为我已定义的类包含其他类我定义的对象的对象编写自定义解码器. “外部”类是Edge,定义如下:
class Edge:
    def __init__(self,actor,movie):
        self.actor = actor
        self.movie = movie

    def __eq__(self,other):
        if (self.movie == other.movie) & (self.actor == other.actor):
            return True
        else:
            return False

    def __str__(self):
        print("Actor: ",self.actor," Movie: ",self.movie)

    def get_actor(self):
        return self.actor

    def get_movie(self):
        return self.movie

与“内部”类的actor和电影定义如下:

class Movie:
    def __init__(self,title,gross,soup,year):
        self.title = title
        self.gross = gross
        self.soup = soup
        self.year = year

    def __eq__(self,other):
        if self.title == other.title:
            return True
        else:
            return False

    def __repr__(self):
        return self.title

    def __str__(self):
        return self.title

    def get_gross(self):
        return self.gross

    def get_soup(self):
        return self.soup

    def get_title(self):
        return self.title

    def get_year(self):
        return self.year

class Actor:
    def __init__(self,name,age,soup):
        self.name = name
        self.age = age
        self.soup = soup

    def __eq__(self,other):
        if self.name == other.name:
            return True
        else:
            return False

    def __repr__(self):
        return self.name

    def __str__(self):
        return self.name

    def get_age(self):
        return self.age

    def get_name(self):
        return self.name

    def get_soup(self):
        return self.soup

(汤只是该电影/演员的维基百科页面的美丽对象,它可以被忽略).
我也为边缘类编写了一个客户编码器:

class EdgeEncoder(json.JSONEncoder):
    def default(self,o):
        if isinstance(o,Edge):
            return {
                    "Actor": {
                             "Name": o.get_actor().get_name(),"Age": o.get_actor().get_age()
                             },"Movie": {
                             "Title": o.get_movie().get_title(),"Gross": o.get_movie().get_gross(),"Year": o.get_movie().get_year()
                             }
                    }
        return json.JSONEncoder.default(self,o)

我已经测试过,它正确地将边缘列表序列化为JSON文件.现在我的问题出现在尝试编写边缘解码器时.我使用了github页面here作为参考,但我的编码器偏离了他,我想知道是否有必要改变它.我是否需要在其JSON序列化中将对象的类型显式编码为其自己的键值对,或者是否有某种方法可以通过边缘的序列化来获取“Actor”和“Movie”键?同样,有没有办法获取“名称”. “Age”等,这样我可以重建Actor / Movie对象,然后使用它们重建边缘?有没有更好的方法来编码我的对象?我也尝试过遵循this教程,但我发现对象dicts的使用让他们的编码器感到困惑,我不知道如何将该方法扩展到包含自定义对象的自定义对象.

解决方法

您引用的编码器/解码器示例( here)可以轻松扩展,以允许JSON输入/输出中的不同类型的对象.

但是,如果您只想要一个简单的解码器来匹配您的编码器(只在您的JSON文件中编码Edge对象),请使用此解码器:

class EdgeDecoder(json.JSONDecoder):
    def __init__(self,*args,**kwargs):
        json.JSONDecoder.__init__(self,object_hook=self.object_hook,**kwargs)
    def object_hook(self,dct):
        if 'Actor' in dct:
            actor = Actor(dct['Actor']['Name'],dct['Actor']['Age'],'')
            movie = Movie(dct['Movie']['Title'],dct['Movie']['Gross'],'',dct['Movie']['Year'])
            return Edge(actor,movie)
        return dct

使用问题中的代码定义类Movie,Actor,Edge和EdgeEncoder,以下代码将输出一个测试文件,然后将其读回:

filename='test.json'
movie = Movie('Python','many dollars','2000')
actor = Actor('Casper Van Dien',49,'')
edge = Edge(actor,movie)
with open(filename,'w') as jsonfile:
    json.dump(edge,jsonfile,cls=EdgeEncoder)
with open(filename,'r') as jsonfile:
    edge1 = json.load(jsonfile,cls=EdgeDecoder)
assert edge1 == edge

如何为复杂对象编写自定义JSON解码器?的更多相关文章

  1. ios – 为什么我的Swift 3.0解码器decodeInteger不能用于整数?

    Int(我从其他帖子中了解到这不起作用……)那么我可能做错了什么?应该说原始值是从float中检索并转换为int.解决方法此问题是由Swift3中的多个更改引起的.在Swift3中,编码方法对于每种类型都是重载的.我们有:和编译器根据第一个参数的类型选择正确的方法.你正在把Int!那里.由于SwiftEvolution0054,Swift3中ImplicitlyUnwrappedOptionals的行为发生了变化.如果您阅读了这些更改,您可以注意到将IUO转换为常规可选项比打开包装更受欢迎,因此转换为An

  2. 如何直接从Android Surface访问EGL图像以用于MediaCodec视频解码器?

    )而无需进行格式转换,但目前还没有类似的机制.我不知道比你描述的更好的方法.更新:我的办公室伙伴提出了一个建议:使用着色器将缓冲区渲染为两个纹理,一个用于Y,另一个用于CbCr.这样可以保持GLES中的所有操作,而不会扩展到完整的RGB.在内部,它会将MediaCodec输出转换为RGB并通过它进行两次研磨,但这可能比将其复制到用户空间并在cpu上自行完成更便宜.

  3. 如何将H.264 NAL设备提供给Android MediaCodec进行解码?

    我应该在发送NAL单元之前剥离0x000x000x01序列吗?我是否需要忽略/删除某些NAL单元类型?

  4. android – 使用MediaCodec截断视频

    我用AndroidMediaCodec库来转码视频文件(主要是改变分辨率Samplecodehere)我想要实现的另一件事是截断视频–仅开始15秒.逻辑是检查videoExtractor.getSampleTime()是否大于15秒,我只是将EOS写入解码器缓冲区.但我得到一个异常引起:android.media.MediaCodec$CodecException:Error0xfffffff3这

  5. PHP下用Swoole实现Actor并发模型的方法

    这篇文章主要介绍了PHP下用Swoole实现Actor并发模型的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. 如何使用Python VTK高亮显示actor

    这篇文章主要介绍了如何使用Python VTK高亮显示actor,通过Python-VTK在同一个窗口中,高亮显示选中的actor。本例子中的代码,当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息,下文相关内容需要的小伙伴可以参考一下

  7. ajax – SCALA Lift – S.tram访问Comet Actor

    我正在尝试检索CoMetactor中的url参数以验证数据源是否与目标匹配,例如用户从房间A发送消息,该消息应该仅在房间A中接收和显示,而不是在B或C中.我试过了:但它总是空的,可以这样做吗?

  8. CentOS 6.5 安装 Mplayer!

    [root@gxh~]#yumlist|grepmplayermplayer.x86_641.0-0.140.20120205svn.el6.1@rpmfusion-free-updatesmplayer-common.x86_641.0-0.140.20120205svn.el6.1@rpmfusion-free-updatesmplayer-doc.x86_641.0-0.140.20120205svn.el6.1rpmfusion-free-updatesmplayer-gui.x86_641.0-

  9. CentOS yum方式安装ffmpeg

    系统为CentOS6.4,自己编译ffmpeg和众多解码器太痛苦了,yum方式安装ffmpeg的解码器很全,先用用看。

  10. Windows – sox FAIL util:无法加载MAD解码器库(libmad)函数“mad_stream_buffer”

    当我尝试读取一个mp3时,我得到这个消息:soxFAILutil:无法加载MAD解码器库函数“mad_stream_buffer”。我编译的项目不正确吗?使用SOX创建MP3的步骤:>下载最新版本的SOX并安装。目前唯一已知的值得信赖的来源是ossbuild,但这需要您下载1.5GB的存档。所选的两个文件可用here。>将libmad-0.dll和lbmp3lame-0.dll添加到安装SOX的文件夹。>使用命令行将文件转换为.mp3:注意:-c2使其立体声,-C128指定输出为128kbpsMP3

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部