首页   注册   登录
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

如何把 bytes 数据放入 json 中?

  •  
  •   melonux · 79 天前 · 1590 次点击
    这是一个创建于 79 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如:
    {
    "filename": "test.exe",
    "content": b"xxxxxx" # len() 大约 1MB 左右
    } # 这样肯定是不行的, json 要求内容必须要能序列化为字符串。

    我现在要在 json 的放一些二进制的数据,如果简单的使用 base64 编码,虽然可以,但会大幅增加数据长度。有没有比较简洁有效的编码方式?

    请给些思路吧,谢谢。
    第 1 条附言  ·  79 天前
    好了。非常感谢大家的建议。

    我改思路了。输入输出全都在 str 上进行。至于 byte<->str 的转换,交给客户端自行处理。
    22 回复  |  直到 2019-04-28 16:12:16 +08:00
        1
    chfight   79 天前
    gzip base64 试一下?
        2
    kiddult   79 天前
    base85? 不过还是用 base64 比较好一些,代码上可读性要好很多
        3
    chinvo   79 天前
    为啥要这么做……
    感觉你这个场景应该是下载文件,json 里面提供个链接,然后访问链接获取 binary 不行么
        4
    dapang1221   79 天前
    二进制的都要 1MB,其他编码形式只能比 1MB 多啊,为什么不建一个存储,json 里放路径呢…
        5
    VDimos   79 天前 via Android
    为啥要在 json 放 binary,这个需求好奇怪
        6
    whatsmyip   79 天前
    type(xxx) = bytes


    type(xxx.encode()) = str
        7
    index90   79 天前
    为什么要用 JSON 来序列化一个二进制文件……
        8
    Cbdy   79 天前 via Android
    base64 编码数据增大了 1/3 (算大幅吗?),其实在大多数场景可以接受吧
    如果接受不了,可以再用一些字符,把键盘上的字符都用一边估计可以😄
        9
    rayingecho   79 天前   ♥ 2
    闻出了 X-Y Problem 的味道: https://coolshell.cn/articles/10804.html
    "我想用 X 实现 Y, 请问 X 要怎么实现?"
    很多时候这是南辕北辙, 建议直接说出你的最终需求, 也就是 Y 是什么
        10
    xfriday   79 天前
    200 OK

    ...
    My-File-Name: test.exe

    <byte[]>
        11
    melonux   79 天前
    @rayingecho 哈哈,挺有趣。
        12
    moonsn1994   79 天前
        13
    melonux   79 天前
    @index90 @chinvo 因为文件的内容是要从一个 json rpc 服务返回来的。这个 rpc 服务本身就是用来根据一个地址返回文件内容。
        14
    ma6254   78 天前
    也就是说,这个接口同时要返回文件附加信息和文件内容,还要是 json,并且要有可读性。
    感觉应该把文件信息和文件内容分成两个接口,这样就只需要维护文件信息接口的可读性,而文件内容接口的可读性就不用管。
    但是这样又可能会带来同步的问题
        15
    zyp0921   78 天前
    全部转成字符串啊,然后拿到的再把字符串转回去就可以了啊
        16
    farseeraliens   78 天前 via iPhone
    @zyp0921 小白请教一下,请问您指的是 byte string 吗?如果是的话,不还得要求协议支持 byte string 吗? http 支持吗?
        17
    zyp0921   78 天前
    @farseeraliens
    sprintf(buf,"%02x",temp);
    str_to_bcd();
    经过这种转换就可以了啊
        18
    farseeraliens   78 天前 via iPhone
    @zyp0921 没理解,这样增大一倍不比 base64 增大三分之一还差?
        19
    leonard916   78 天前   ♥ 1
    我覺得樓主可以考慮 BSON ( http://bsonspec.org/
        20
    zyp0921   78 天前
    @farseeraliens 大就大点,没关系- - 要不考虑用 protobuf
        21
    melonux   76 天前
    @leonard916 嗯,终于意识到 BSON 解决的是个什么问题了
        22
    NoKey   27 天前
    我现在也有个这种需求,json 返回人员信息,但是人员信息太大,所以对信息进行 gzip 压缩,压缩出来的就是 byte,我也在纠结,byte 如何放到 json 里面。
    楼上提到的一些方案会增大数据容量的方法不行,gzip 就是为了减少数据大小
    byte 转 string,然后 string 又转回 byte,好像有问题
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   772 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 21:06 · PVG 05:06 · LAX 14:06 · JFK 17:06
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1