4

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

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

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

在 python 3 中,我有这个:

   import ujson
   ujson.dumps(d)

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

4

2 回答 2

1

在 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。我不确定如何让 json.dumps() 实际为您提供 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)

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

于 2021-01-12T17:22:19.887 回答
-1

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

希望能帮助到你!

于 2018-04-29T06:27:34.397 回答