Принуждение модуля Python json к работе с ASCII

Я использую json.dump() и json.load() для сохранения/чтения словаря строк на/с диска. Проблема в том, что я не могу иметь ни одной строки в unicode. Они, похоже, находятся в юникоде, независимо от того, как я устанавливаю параметры для дампа/загрузки (включая security_ascii и кодировку).

Ответы

Ответ 1

Если вы просто используете простые объекты JSON, вы можете использовать следующее:

def ascii_encode_dict(data):
    ascii_encode = lambda x: x.encode('ascii')
    return dict(map(ascii_encode, pair) for pair in data.items())

json.loads(json_data, object_hook=ascii_encode_dict)

Вот пример того, как он работает:

>>> json_data = '{"foo": "bar", "bar": "baz"}'
>>> json.loads(json_data)                                # old call gives unicode
{u'foo': u'bar', u'bar': u'baz'}
>>> json.loads(json_data, object_hook=ascii_encode_dict) # new call gives str
{'foo': 'bar', 'bar': 'baz'}

Этот ответ работает для более сложной структуры JSON и дает хорошее объяснение по параметру object_hook. Там также есть еще один ответ, который рекурсивно берет результат вызова json.loads() и преобразует все строки Unicode в байтовые строки.

Ответ 2

И если json-объект представляет собой комбинацию типов данных, а не только строк Unicode, вы можете использовать это выражение:

def ascii_encode_dict(data):
    ascii_encode = lambda x: x.encode('ascii') if isinstance(x, unicode) else x 
    return dict(map(ascii_encode, pair) for pair in data.items())