我需要将这个python dict转换成二进制json
d = {'1': 'myval', '2': 'myval2'} json_binary_str = b'{"1": "myval", "2": "myval2"}'
在Python 3中,我有这样一个:
import ujson ujson.dumps(d)
但是,这并不创建二进制字符串。我怎么能这样做呢?
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)
然后你不需要它的二进制文件,因为文件是在文本模式下打开的,编码是为你做的。
kq0g1dla2#
如果需要将JSON转换为二进制,则需要使用dumps()将其转换为字符串,然后可以将其转换为二进制,如下所示
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'}
希望有帮助!
r7knjye23#
我认为这是一个两步走的问题
**第一步:**将json转换为字符串my_string = json.dumps(my_json)**第二步:**将字符串转换为二进制字符串my_binary_string = my_string.encode('utf-8')
my_string = json.dumps(my_json)
my_binary_string = my_string.encode('utf-8')
或者显然在一行my_binary_string = json.dumps(my_json).encode('utf-8')中
my_binary_string = json.dumps(my_json).encode('utf-8')
3条答案
按热度按时间r9f1avp51#
在RFC https://www.rfc-editor.org/rfc/rfc7159中,它说:
乍一看,Python似乎并没有真正遵循规范,当你第一次看到这个的时候,毕竟当它仍然是一个Python3 'str'字符串时,编码是什么意思,然而Python还是为你做了一些编码。试试这个:
您可以看到日语已经转换为unicode转义,结果字符串实际上是ASCII,即使它仍然是Python str()实际上给予你UTF-8序列-为了互操作性的目的-如果你想要它们,然而,对于大多数人来说,这已经足够好了。字符就在那里,并且会被正确地解释。使用以下命令很容易获得二进制:
Python在加载时做了正确的事情:
但是,如果你根本不需要编码,loads()仍然会在给定str时找出要做的事情:
Python一如既往地试图尽可能地帮助你弄清楚你想要什么并去做,但这对那些深入挖掘的人来说是令人困惑的,尽管我对Python有一点点的热爱,但我同情OP。这种“有帮助”的行为是否值得困惑是一个争论,这将是一个激烈的争论。
值得注意的是,如果输出的下一件事是写入文件,那么你可以这样做:
然后你不需要它的二进制文件,因为文件是在文本模式下打开的,编码是为你做的。
kq0g1dla2#
如果需要将JSON转换为二进制,则需要使用
dumps()
将其转换为字符串,然后可以将其转换为二进制,如下所示binary_data输出为
received_data的输出是
希望有帮助!
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')
中