V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pushyzheng
V2EX  ›  Python

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

  •  1
     
  •   pushyzheng ·
    pushyzheng · 2019-06-19 20:59:24 +08:00 · 2833 次点击
    这是一个创建于 1983 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写 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)
    
    8 条回复    2019-06-20 12:37:31 +08:00
    pushyzheng
        1
    pushyzheng  
    OP
       2019-06-19 21:00:41 +08:00
    搭配 py3.6 类型标记食用更佳
    xiangyuecn
        2
    xiangyuecn  
       2019-06-19 21:14:09 +08:00
    看标题还以为是自己写的解析,没想到还是调用的 api 😂
    rogwan
        3
    rogwan  
       2019-06-19 21:30:16 +08:00
    对比 字典 <--> json 的方式,是由性能优势?还是空间优势?
    siteshen
        4
    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
        5
    misaka19000  
       2019-06-19 21:48:48 +08:00
    。。。鼓励一下
    BingoXuan
        6
    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
        7
    whusnoopy  
       2019-06-20 07:29:53 +08:00 via Android
    @BingoXuan namedtuple 了解一下?
    yushenglin
        8
    yushenglin  
       2019-06-20 12:37:31 +08:00
    DRF 的序列化器了解一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1156 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:49 · PVG 07:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.