如何把 bytes 数据放入 json 中? - V2EX
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 6363 次点击
    这是一个创建于 2415 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如:
    {
    "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/div>
       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     Solana     3356 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 10:30 PVG 18:30 LAX 03:30 JFK 06:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86