Проблема: это не читается человеком. Мои (умные) пользователи хотят проверять или даже редактировать текстовые файлы с помощью JSON-дампов (и я бы предпочел не использовать XML).
Есть ли способ сериализовать объекты в строки JSON в формате UTF-8 (вместо \uXXXX)?
Переведено автоматически
Ответ 1
Используйте ensure_ascii=False переключатель на json.dumps(), затем закодируйте значение в UTF-8 вручную:
Если вы выполняете запись в файл, просто используйте json.dump() и предоставьте файловому объекту кодировать:
withopen('filename', 'w', encoding='utf8') as json_file: json.dump("ברי צקלה", json_file, ensure_ascii=False)
Предостережения для Python 2
Для Python 2 следует учитывать еще несколько предостережений. Если вы записываете это в файл, вы можете использовать io.open() вместо open() для создания файлового объекта, который кодирует значения Unicode для вас при записи, затем используйте json.dump() вместо этого для записи в этот файл:
with io.open('filename', 'w', encoding='utf8') as json_file: json.dump(u"ברי צקלה", json_file, ensure_ascii=False)
Обратите внимание, что в json есть ошибка, из-за которой ensure_ascii=False флаг может создавать сочетание объектов unicode и str. Тогда обходной путь для Python 2 таков:
with io.open('filename', 'w', encoding='utf8') as json_file: data = json.dumps(u"ברי צקלה", ensure_ascii=False) # unicode(data) auto-decodes data to unicode if str json_file.write(unicode(data))
В Python 2 при использовании байтовых строк (type str), закодированных в UTF-8, обязательно укажите encoding ключевое слово:
d = {u'keyword': u'bad credit \xe7redit cards'} with io.open('filename', 'w', encoding='utf8') as json_file: data = json.dumps(d, ensure_ascii=False).decode('utf8') try: json_file.write(data) except TypeError: # Decode data to Unicode first json_file.write(data.decode('utf8'))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 25: ordinal not in range(128)
Сбой происходил в части .decode ('utf8') строки 3. Я исправил проблему, значительно упростив программу, избежав этого шага, а также специальной оболочки ASCII.:
with io.open('filename', 'w', encoding='utf8') as json_file: data = json.dumps(d, ensure_ascii=False, encoding='utf8') json_file.write(unicode(data))