首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python的JSONDecoder?

如何使用Python的JSONDecoder?
EN

Stack Overflow用户
提问于 2022-03-08 15:16:25
回答 1查看 702关注 0票数 2

在我的一生中,我还没有找到Python的任何例子。

假设我有一个类Person,并且我想从该类序列化和反序列化一个对象。

代码语言:javascript
复制
class Person:
    def __init__(self, n, b):
        self._name = n
        self._born = b

    @property
    def name(self):
        return self._name

    @property
    def born(self):
        return self._born

    def __str__(self):
        return f"{self.name} was born in {self.born.isoformat()}"

p1 = Person("Baltasar", datetime(1919, 7, 1))

现在,我想序列化这个不错的Person对象,并且我想支持datetime对象。因此,我编写了一个自定义序列化程序:

代码语言:javascript
复制
class JSONCoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return { "__class__": "datetime",
                     "y": obj.year,
                     "month": obj.month,
                     "d": obj.day,
                     "h": obj.hour,
                     "minute": obj.minute,
                     "s": obj.second }

        return json.JSONEncoder.default(self, obj)

其目的是能够支持几种类型,包括datetime

现在是反序列化的时候了。我必须编写一个custome反序列化器来匹配序列化程序。下面是:

代码语言:javascript
复制
class JSONDCoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=JSONDCoder.from_dict)

    @staticmethod
    def from_dict(d):
        if d.get("__class__") == "datetime":
            return datetime(d["y"], d["month"], d["d"],
                            d["h"], d["minute"], d["s"])

如果我触发:

代码语言:javascript
复制
coder = JSONCoder()
s = coder.encode(p1.__dict__)
print("Encoded: " + s)

dcoder = JSONDCoder()
d = dcoder.decode(s)
print("Decoded: " + str(d))

我得到以下输出:

代码语言:javascript
复制
Encoded: {"_name": "Baltasar", "_born": {"__class__": "datetime", "y": 1919, "month": 7, "d": 0, "h": 0, "minute": 0, "s": 0}}
Decoded: None
...

除了None之外,获得任何内容的唯一方法是修改解码器并将其更改为:

代码语言:javascript
复制
class JSONDCoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=JSONDCoder.from_dict)

    @staticmethod
    def from_dict(d):
        if d.get("__class__") == "datetime":
            return d

任何其他选项都可以返回None,如上面所示。

如何使我的自定义解码器支持datetime类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-08 15:33:57

您只是忘了在from_dict方法的末尾添加返回语句。

代码语言:javascript
复制
class JSONDCoder(json.JSONDecoder):
def __init__(self):
    json.JSONDecoder.__init__(self, object_hook=JSONDCoder.from_dict)

@staticmethod
def from_dict(d):
    if d.get("__class__") == "datetime":
        return datetime(d["y"], d["month"], d["d"],
                        d["h"], d["minute"], d["s"])
    return d

这个定义应该有效,我的输出如下:

代码语言:javascript
复制
Encoded: {"_name": "Baltasar", "_born": {"__class__": "datetime", "y": 1919, "month": 7, "d": 1, "h": 0, "minute": 0, "s": 0}}
Decoded: {'_name': 'Baltasar', '_born': datetime.datetime(1919, 7, 1, 0, 0)}

告诉我这是不是你要找的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71397342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档