首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   pushyzheng · 121 天前 · 1100 次点击
    这是一个创建于 121 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写 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
        1
    pushyzheng   121 天前
    搭配 py3.6 类型标记食用更佳
        2
    xiangyuecn   121 天前
    看标题还以为是自己写的解析,没想到还是调用的 api 😂
        3
    rogwan   121 天前
    对比 字典 <--> json 的方式,是由性能优势?还是空间优势?
        4
    siteshen   121 天前
    两点建议:

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

    尽管如此,我还是觉得 python 缺乏 struct 那样简单的构造数据的方法。
        7
    whusnoopy   121 天前 via Android
    @BingoXuan namedtuple 了解一下?
        8
    yushenglin   121 天前
    DRF 的序列化器了解一下
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2092 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 11:51 · PVG 19:51 · LAX 04:51 · JFK 07:51
    ♥ Do have faith in what you're doing.