Самый быстрый способ Python DICT для JSON двоичной строки
Мне нужно преобразовать этот python dict в двоичный JSON
d = {'1': 'myval', '2': 'myval2'}
json_binary_str = b'{"1": "myval", "2": "myval2"}'
в питоне 3 у меня есть это:
import ujson
ujson.dumps(d)
но это не создает двоичную строку. Как я могу это сделать?
3 ответа
В 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"}'
Вы можете видеть, что японский язык был преобразован в escape-последовательности 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': '日本'}
Но если вы вообще не беспокоитесь о кодировании, load () все равно выясняет, что делать, когда задана str:
>>> json.loads(json.dumps({"Japan":"日本"}))
{'Japan': '日本'}
Python, как всегда, пытается быть как можно более полезным в выяснении того, что вы хотите, и в выполнении этого, но это вызывает недоумение у людей, которые копают немного глубже, и, несмотря на то, что Python любит до мелочей, я сочувствую OP. Стоит ли такое «полезное» поведение путаницы - это споры, которые будут продолжаться.
Стоит отметить, что если следующее, что нужно сделать с выводом, - это запись в файл, вы можете просто сделать:
pathlib.Path("myfile.json").open("w").write(json_data)
Тогда вам не нужен двоичный файл, потому что файл открывается в текстовом режиме и кодирование выполняется за вас.
Я рассматриваю это как двухэтапную проблему
Шаг 1. Преобразование json в строкуmy_string = json.dumps(my_json)
Шаг 2. Преобразование строки в двоичную строку.my_binary_string = my_string.encode('utf-8')
Или, очевидно, в одну строкуmy_binary_string = json.dumps(my_json).encode('utf-8')
Если вам нужно преобразовать 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
вывод двоичных_данных
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
Выходные данные Receive_data:
{u'1': u'myval', u'2': u'myval2'}
Надеюсь, поможет!