Python 2.7> 3.5 дампы JSON «не являются строкой»

Я конвертирую свой код с 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':
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
933
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно преобразовать байтовые данные в строковые.

file = open(file_name, encoding='utf8')
json_data = json.load(file)
file.close()

спасибо jesugmz, так как я узнаю, что в моем коде есть байтовые значения? Итак, я знаю, для чего мне это нужно сделать?

p0nts 05.05.2018 19:29

в основном так работает open, поскольку в документации указано [...] байты были сначала декодированы с использованием зависящей от платформы кодировки или с использованием указанной кодировки, если задано [...], и вы не указали кодировку, поэтому она была обработана как str-byte. Также вы можете проверить тип данных с помощью тип().

jesugmz 05.05.2018 19:50

спасибо, поэтому я сделал str (bytes_data, 'utf-8', прежде чем добавлять его в dict, и теперь он работает :)

p0nts 05.05.2018 20:02
Ответ принят как подходящий

Вам необходимо преобразовать любые ключи, которые являются байтовыми литералами, в строки. вы можете сделать замену с 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
p0nts 05.05.2018 19:42

Я не уверен, что там происходит.

kpie 05.05.2018 19:50

Итак, если я напечатаю некоторые из варов, они уже являются строками ... <class 'str'> <class 'str'> Почему у них все еще есть b 'перед ними? : |

p0nts 05.05.2018 19:55

спасибо, поэтому я сделал str (bytes_data, 'utf-8', прежде чем добавлять его в dict, и теперь он работает :)

p0nts 05.05.2018 20:02

Другие вопросы по теме