Ответы пользователя по тегу JSON
  • Как поменять данные в JSON из Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Да, JSON нецелесообразно менять прямо на диске. Его нужно загрузить, распарсить, заменить значение, потом снова сериализовать данные в JSON и сохранить на диск.
    import json
    with open('myfile.json') as f:
        data = json.load(f)
    data['example1'] = 'bye'
    with open('myfile.json', 'w') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)
    Ответ написан
    8 комментариев
  • Как получить русский текст из json на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не надо там ничего энкодить и декодить.
    В ответе текст в юникоде и парсится функцией `json.loads` адекватно.
    Проблема скорее всего у вас из-за кодировки в консоли винды. там какая-нибудь однобайтовая кодировка вроде cp1251 или cp866.
    При попытке напечатать юникод в этом терминале вы получаете ошибку из-за того, что при автоматическом преобразовании из юникода в кодировку консоли питон пытается взять кодек по умолчанию, который, конечно 'ascii'.

    Винда такая винда со своим беспощадным терминалом и кодировками по умолчанию.

    Но вы можете напечатать этот текст, в нём нет непечатных символов для однобайтовой кодировки. Попробуйте так:

    x = obj['result'][-1]['status']
    try:
        print('cp1251:', x.encode('cp1251'))
    except:
        try:
            print('cp866:', x.encode('cp866'))
        except:
            print('no way')


    Общие правила работы с кодировками такие:
    - на входе в программу мы всё преобразовываем в юникод.
    - на выходе всё кодируем в нужную кодировку.
    - если выход - это печать в стандартный вывод (stdout), то ситуаций может быть 4:
    1) печатаем в терминал винды и терминал у нас в кодировке 1251
    2) печатаем в терминал и он у нас в 866 кодировке
    3) печатаем в stdout, который перенаправлен в файл и пайп не знает в какой он кодировке, то есть кодировка не задана и мы можем заэнкодить в любую и в файл это запишется. Пользутейс utf8 - самая правильная кодировка для всего.
    4) вы в линуксе и терминал у вас в кодировке по умолчанию - utf8 и всё хорошо.

    В любом случае, печатая или сохраняя что-то в файл вы должны понимать, что текст нужно закодировать в кодировку. Это может произойти неявно (как в ашем случае) но при попытке закодировать в кодировку по умолчанию (ascii) не каждый символ в ней можно представить. В ASCII всего 127 символов. Получилась закономерная ошибка.

    У потоков стандартного ввода/вывода есть атрибут encoding:
    import sys
    sys.stdout.encoding  # 'UTF-8'

    В вашем случае будет либо None, если вывод перенаправлен в файл,
    либо 'cp1251', либо 'cp866' ну или ещё что-нибудь эдакое.
    Если не None, то в эту кодировку можно постараться заэнкодить вашу строку. По-прежнему некоторые символы могут не конвертнуться (не в вашем случае), их можно игнорировать специальным аргументом метода encode.
    Ответ написан
    1 комментарий
  • Как перевести JSON в PythonObj без кракозябр?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Dmitry Azarenko привел отличный вариант.
    Ещё можно задампить d json с указанными вами параметрами то, что вы печатаете и напечатаь результат дампа, а не repr
    Ответ написан
    Комментировать