繁体   English   中英

python dict 到 json 二进制字符串的最快方法

[英]fastest way to python dict to json binary string

我需要将此python dict转换为二进制json

   d = {'1': 'myval', '2': 'myval2'}

   json_binary_str = b'{"1": "myval", "2": "myval2"}'

在python 3中,我有这个:

   import ujson
   ujson.dumps(d)

但是,这不会创建二进制字符串。 我怎样才能做到这一点 ?

在 RFC https://tools.ietf.org/html/rfc7159 中,它说:

JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32

乍一看,当你第一次看到这个时,Python 似乎并没有真正遵循规范,毕竟当它仍然是 Python3 'str' 字符串时编码意味着什么,但是 Python 正在为你做一些编码。 尝试这个:

>>> json.dumps({"Japan":"日本"})
'{"Japan": "\\u65e5\\u672c"}'

您可以看到日语已转换为 unicode 转义,结果字符串实际上是 ASCII,即使它仍然是 Python str。 我不确定如何让 json.dumps() 真正为您提供 utf-8 序列 - 用于互操作性目的 - 如果您需要它们,但是对于所有实际目的来说,这对大多数人来说已经足够了。 字符在那里,将被正确解释。 很容易获得二进制文件:

>>> json.dumps({"Japan":"日本"}).encode("ascii")
b'{"Japan": "\\u65e5\\u672c"}'

当重新加载时,python 做了正确的事情:

>>> json.loads(json.dumps({"Japan":"日本"}).encode("ascii"))
{'Japan': '日本'}

但是如果你根本不关心编码,当给定一个 str 时,loads() 仍然会计算出要做什么:

>>> json.loads(json.dumps({"Japan":"日本"}))
{'Japan': '日本'}

Python - 一如既往 - 试图在弄清楚你想要什么并做它时尽可能地提供帮助,但这对于深入挖掘的人来说是令人困惑的,尽管我很喜欢 Python,但我对 OP 表示同情。 这种“有帮助”的行为是否值得混淆是一场激烈的辩论。

值得注意的是,如果接下来要做的输出是写入文件,那么您可以这样做:

pathlib.Path("myfile.json").open("w").write(json_data)

然后你不需要它二进制,因为文件是以文本模式打开的,并且编码已经为你完成了。

如果您需要将 JSON 转换为二进制,则需要使用dumps()将其转换为字符串,然后您可以将其转换为二进制,如下所示

  import json

if __name__ == '__main__':
    sent_data = {'1': 'myval', '2': 'myval2'}
    dumped_json_string = json.dumps(sent_data)
    binary_data = ' '.join(format(ord(letter), 'b') for letter in dumped_json_string)
    print binary_data

    jsn = ''.join(chr(int(x, 2)) for x in binary_data.split())
    received_data = json.loads(jsn)
    print received_data

binary_data 的输出是

1111011 100010 110001 100010 111010 100000 100010 1101101 1111001 1110110 1100001 1101100 100010 101100 100000 100010 110010 100010 111010 100000 100010 1101101 1111001 1110110 1100001 1101100 110010 100010 1111101

received_data 的输出是

{u'1': u'myval', u'2': u'myval2'}

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM