如何把 bytes 数据放入 json 中?

2019-03-07 18:52:08 +08:00
 melonux
比如:
{
"filename": "test.exe",
"content": b"xxxxxx" # len() 大约 1MB 左右
} # 这样肯定是不行的, json 要求内容必须要能序列化为字符串。

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

请给些思路吧,谢谢。
5788 次点击
所在节点    Python
22 条回复
chfight
2019-03-07 19:07:02 +08:00
gzip base64 试一下?
kiddult
2019-03-07 19:07:37 +08:00
base85? 不过还是用 base64 比较好一些,代码上可读性要好很多
chinvo
2019-03-07 19:08:31 +08:00
为啥要这么做……
感觉你这个场景应该是下载文件,json 里面提供个链接,然后访问链接获取 binary 不行么
dapang1221
2019-03-07 19:09:48 +08:00
二进制的都要 1MB,其他编码形式只能比 1MB 多啊,为什么不建一个存储,json 里放路径呢…
VDimos
2019-03-07 19:16:49 +08:00
为啥要在 json 放 binary,这个需求好奇怪
whatsmyip
2019-03-07 19:20:16 +08:00
type(xxx) = bytes


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

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

<byte[]>
melonux
2019-03-07 19:44:56 +08:00
@rayingecho 哈哈,挺有趣。
moonsn
2019-03-07 19:46:46 +08:00
melonux
2019-03-07 19:46:57 +08:00
@index90 @chinvo 因为文件的内容是要从一个 json rpc 服务返回来的。这个 rpc 服务本身就是用来根据一个地址返回文件内容。
ma6254
2019-03-08 05:20:56 +08:00
也就是说,这个接口同时要返回文件附加信息和文件内容,还要是 json,并且要有可读性。
感觉应该把文件信息和文件内容分成两个接口,这样就只需要维护文件信息接口的可读性,而文件内容接口的可读性就不用管。
但是这样又可能会带来同步的问题
zyp0921
2019-03-08 08:43:01 +08:00
全部转成字符串啊,然后拿到的再把字符串转回去就可以了啊
farseeraliens
2019-03-08 09:19:26 +08:00
@zyp0921 小白请教一下,请问您指的是 byte string 吗?如果是的话,不还得要求协议支持 byte string 吗? http 支持吗?
zyp0921
2019-03-08 09:35:20 +08:00
@farseeraliens
sprintf(buf,"%02x",temp);
str_to_bcd();
经过这种转换就可以了啊
farseeraliens
2019-03-08 09:58:24 +08:00
@zyp0921 没理解,这样增大一倍不比 base64 增大三分之一还差?
leonard916
2019-03-08 15:13:05 +08:00
我覺得樓主可以考慮 BSON ( http://bsonspec.org/
zyp0921
2019-03-08 15:43:00 +08:00
@farseeraliens 大就大点,没关系- - 要不考虑用 protobuf

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/542248

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX