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
runner321
V2EX  ›  Python

关于 Python 的对象序列化和反序列化? 如何从 json 字符串直接反序化为指定类实例?

  •  
  •   runner321 · 2021-03-25 23:31:49 +08:00 · 1663 次点击
    这是一个创建于 1340 天前的主题,其中的信息可能已经有所发展或是发生改变。
    遇到两种常见的情况,之前写 java 很容易,但发现在 python 不方便。

    Python Object => 序列化 => 字符串, 很多类型不支持

    json 字符串 =》 反序列号 =》 指定类型的 Python Object, 目前没找到好的实现,有没有跟 java 的 Gson 、fastjson 类似的 Json 解析库
    ClericPy
        1
    ClericPy  
       2021-03-25 23:45:41 +08:00
    不支持的是不能 pickle 的么, 那官方的办法确实不好办了(以前还考虑过把 pickle.dumps 的 base64 一波)

    能给个例子什么的么, 如果是 JSON 的话, json.dumps 的 default 参数够用么, 没例子实在想象不到 Java 怎么整...
    test0x01
        2
    test0x01  
       2021-03-26 01:44:54 +08:00 via Android
    pydantic
    runner321
        3
    runner321  
    OP
       2021-03-26 09:54:58 +08:00
    @ClericPy 我指的是 json,从 对象 => json 字符串 可以用 default 。

    但反方向,从 json 字符串 =》 对象,有什么好的实现方式吗?

    json.loads 没法直接反序列化到一个指定的类实例
    no1xsyzy
        4
    no1xsyzy  
       2021-03-26 10:11:17 +08:00
    所以 #2 说了 pip install pydantic

    Model.parse_raw(json_str) 或者 Model.json()
    abersheeran
        5
    abersheeran  
       2021-03-26 16:26:12 +08:00
    pydantic 是 json <--> dict <--> obj 而且仅支持它写了的类型

    楼主的需要应该用标准库里的 object_hook 参数解决。另外,随手给你搜了一下 “python parse json to obj” 第一个回答是 https://stackoverflow.com/questions/6578986/how-to-convert-json-data-into-a-python-object 楼主可以试试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5886 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 06:26 · PVG 14:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.