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

如何把 bytes 数据放入 json 中?

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

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

    请给些思路吧,谢谢。
    第 1 条附言  ·  2019-03-07 19:53:22 +08:00
    好了。非常感谢大家的建议。

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


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

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

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