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

a1o7rhls  于 2023-04-22  发布在  Python
关注(0)|答案(3)|浏览(154)

我需要将这个python dict转换成二进制json

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

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

在Python 3中,我有这样一个:

import ujson
   ujson.dumps(d)

但是,这并不创建二进制字符串。我怎么能这样做呢?

r9f1avp5

r9f1avp51#

在RFC https://www.rfc-editor.org/rfc/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()实际上给予你UTF-8序列-为了互操作性的目的-如果你想要它们,然而,对于大多数人来说,这已经足够好了。字符就在那里,并且会被正确地解释。使用以下命令很容易获得二进制:

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

Python在加载时做了正确的事情:

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

但是,如果你根本不需要编码,loads()仍然会在给定str时找出要做的事情:

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

Python一如既往地试图尽可能地帮助你弄清楚你想要什么并去做,但这对那些深入挖掘的人来说是令人困惑的,尽管我对Python有一点点的热爱,但我同情OP。这种“有帮助”的行为是否值得困惑是一个争论,这将是一个激烈的争论。
值得注意的是,如果输出的下一件事是写入文件,那么你可以这样做:

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

然后你不需要它的二进制文件,因为文件是在文本模式下打开的,编码是为你做的。

kq0g1dla

kq0g1dla2#

如果需要将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'}

希望有帮助!

r7knjye2

r7knjye23#

我认为这是一个两步走的问题

**第一步:**将json转换为字符串my_string = json.dumps(my_json)
**第二步:**将字符串转换为二进制字符串my_binary_string = my_string.encode('utf-8')

或者显然在一行my_binary_string = json.dumps(my_json).encode('utf-8')

相关问题