Я конвертирую свой код с Python 2.7 на 3.5, но сталкиваюсь с некоторыми проблемами при сбросе данных JSON в файл.
Первоначально код 2.7 был таким:
backlog_json = json.dumps(backlog, indent=2, sort_keys=True)
f = open(backlog_path,"wt")
f.write(backlog_json)
f.close()
В настоящее время тот же код дает следующую ошибку:
TypeError: key b'00c4349c-9617-42c3-a0a3-8e16262bcd76' is not a string
Кажется, он что-то делает с байтами, а я просто хочу, чтобы все элементы в моем JSON были строками.
почему-то в данные dict добавлен b':
b'f91de40f-cf15-4da6-bee9-0101920c8874':






Вам нужно преобразовать байтовые данные в строковые.
file = open(file_name, encoding='utf8')
json_data = json.load(file)
file.close()
в основном так работает open, поскольку в документации указано [...] байты были сначала декодированы с использованием зависящей от платформы кодировки или с использованием указанной кодировки, если задано [...], и вы не указали кодировку, поэтому она была обработана как str-byte. Также вы можете проверить тип данных с помощью тип().
спасибо, поэтому я сделал str (bytes_data, 'utf-8', прежде чем добавлять его в dict, и теперь он работает :)
Вам необходимо преобразовать любые ключи, которые являются байтовыми литералами, в строки. вы можете сделать замену с str(bytes_string, 'utf-8'), но сначала вы должны их найти. Если очевидно, где существуют эти байтовые литералы, вы можете написать код, чтобы отключить их, или вы можете преобразовать вот так ...
def reqked(ob):
if (type(ob) == dict):
for(k in ob.keys()):
if (type(k) == bytes):
ob[str(k, 'utf-8')] = reqked(ob[k])
del ob[k]
else:
ob[k] = reqked(ob[k])
elif (type(ob) == list):
for k in range(0,len(ob)):
ob[k]=reqked(ob[k])
elif (type(ob) == bytes):
ob = str(bytes_string, 'utf-8')
return(ob)
backlog_info2[str(k,'utf-8')] = v TypeError: decoding str is not supportedЯ не уверен, что там происходит.
Итак, если я напечатаю некоторые из варов, они уже являются строками ... <class 'str'> <class 'str'> Почему у них все еще есть b 'перед ними? : |
спасибо, поэтому я сделал str (bytes_data, 'utf-8', прежде чем добавлять его в dict, и теперь он работает :)
спасибо jesugmz, так как я узнаю, что в моем коде есть байтовые значения? Итак, я знаю, для чего мне это нужно сделать?