分享一个 Python JSON to Object 的序列化和反序列化

2019-06-19 20:59:24 +08:00
 pushyzheng

之前写 py 关于 JSON 的序列化都是用字典来操作,比较不方便,今儿实现下 json->object 的序列化方式,发现还挺方便,分享给大家。py 菜鸟,大佬轻喷。。。使用方法如下:

核心类:

class JsonClass(object):

    def to_json_string(self):
        return json.dumps(self, default=lambda obj: obj.__dict__)

    def from_json_string(self, json_string):
        data = json.loads(json_string)

        for key in self.__dict__.keys():
            setattr(self, key, data[key])

使用方法:

class Task(JsonClass):
    def __int__(self, id=None, name=None, timestamp=None):
        self.id = id
        self.name = name
        self.timestamp = timestamp

if __name__ == '__main__':
    # 序列化
    task = Task(1, "a", time.time())
    print(task.to_json_string())

    # 反序列化
    json_string = '{"timestamp": 1560948789.5293133, "name": "a", "id": 1}'
    task = Task()
    task.from_json_string(json_string)
2670 次点击
所在节点    Python
8 条回复
pushyzheng
2019-06-19 21:00:41 +08:00
搭配 py3.6 类型标记食用更佳
xiangyuecn
2019-06-19 21:14:09 +08:00
看标题还以为是自己写的解析,没想到还是调用的 api 😂
rogwan
2019-06-19 21:30:16 +08:00
对比 字典 <--> json 的方式,是由性能优势?还是空间优势?
siteshen
2019-06-19 21:45:27 +08:00
两点建议:

1. 类名叫 JsonSerializableMixin,否则看到类名 JsonClass 会觉得是个特别重大的功能;
2. from_json_string 改为 class method,因为 from_json_string 的意思其实是 create OBJECT from json string,所以由这个函数负责创建对象。如果函数名是类似 update_with_json_string 则没这个意义不明确的问题。
misaka19000
2019-06-19 21:48:48 +08:00
。。。鼓励一下
BingoXuan
2019-06-19 21:49:37 +08:00
然而实质还是序列化和反序列化字典,因为字典是最接近 json 的结构的。lz 可以试一下这个,访问字典值如同访问对象属性。json.dumps 依旧有效。
https://stackoverflow.com/questions/4984647/accessing-dict-keys-like-an-attribute

尽管如此,我还是觉得 python 缺乏 struct 那样简单的构造数据的方法。
whusnoopy
2019-06-20 07:29:53 +08:00
@BingoXuan namedtuple 了解一下?
yushenglin
2019-06-20 12:37:31 +08:00
DRF 的序列化器了解一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX