我需要将这个python dict转换为二进制json
d = {'1': 'myval', '2': 'myval2'}
json_binary_str = b'{"1": "myval", "2": "myval2"}'
在python 3中,我有这个:
import ujson
ujson.dumps(d)
但是,这不会创建二进制字符串。 我怎么能这样做?
答案 0 :(得分:1)
在 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,但我同情操作。这种“有帮助”的行为是否值得混淆是一场激烈的辩论。
值得注意的是,如果接下来要做的输出是写入文件,那么您可以这样做:
pathlib.Path("myfile.json").open("w").write(json_data)
那么你就不需要它二进制了,因为文件是以文本模式打开的,并且编码已经为你完成了。
答案 1 :(得分:0)
如果您需要将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'}
希望它有所帮助!