Анализировать JSON, содержащий "\ u как байты UTF-8" в Python - PullRequest
0 голосов
/ 13 мая 2018

У меня есть файл JSON из функции Facebook «Скачать данные», и вместо экранирования символов Юникода в качестве номера их кодовой точки он экранируется как последовательность байтов UTF-8.

Например,буква á (U + 00E1) в файле JSON экранируется как \u00c3\u00a1 вместо \u00e1.0xC3 0xA1 - кодировка UTF-8 для U + 00E1.

Библиотека json в Python 3 декодирует ее как Ã, что соответствует U + 00C3 и U + 00A1.

Есть лиспособ правильно проанализировать такой файл (чтобы я получил букву А) в Python?

1 Ответ

0 голосов
/ 13 мая 2018

Кажется, что они закодировали свою строку Unicode в байты, используя utf-8, а затем преобразовали байты в JSON. Это очень плохое поведение с их стороны.

Пример Python 3:

>>> '\u00c3\u00a1'.encode('latin1').decode('utf-8')
'á'

Вам нужно проанализировать JSON и просмотреть все данные, чтобы исправить это:

def visit_list(l):
    return [visit(item) for item in l]

def visit_dict(d):
    return {visit(k): visit(v) for k, v in d.items()}

def visit_str(s):
    return s.encode('latin1').decode('utf-8')

def visit(node):
    funcs = {
        list: visit_list,
        dict: visit_dict,
        str: visit_str,
    }
    func = funcs.get(type(node))
    if func:
        return func(node)
    else:
        return node

incorrect = '{"foo": ["\u00c3\u00a1", 123, true]}'
correct_obj = visit(json.loads(incorrect))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...