Задать вопрос
Ответы пользователя по тегу JSON
  • Преобразовать в JSON?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    import sys
    import re
    import json
    
    
    r1 = re.compile(
        r"(?P<who>\S*) has (?P<ncalls>\d*) calls \(max (?P<maxcalls>\S*)\) in \'(?P<start>\S*)\' strategy \((?P<holdtime>\S*) holdtime, (?P<talktime>\S*) talktime\), W:(?P<w>\d*), C:(?P<c>\d*), A:(?P<a>\d*), SL:(?P<sl>\S*) within (?P<within>\S*)\s*$"
    )
    
    
    with open('ast.txt') as f:
    
        js = []
        append_to = []
        m = None
        for l in f:
            m = r1.match(l)
            if m:
                js.append(dict(members=[], callers=[], **m.groupdict()))
                m = None
            elif 'No Members' in l or 'No Callers' in l:
                pass
            elif 'Members:' in l:
                append_to = js[-1]['members']
            elif 'Callers:' in l:
                append_to = js[-1]['callers']
            elif l.strip():
                append_to.append(l)
    
        print(json.dumps(js, indent=2))


    Также можно парсить еще одним регекспом и строки второго уровня. Если надо, напишу вам регексп.
    Или что вам там требуется вообще?

    Вот ещё вариант:
    cat logfile.log | py -x "getattr(re.match('^(\S+) has (\S+) calls.*$', x), 'groups', lambda: None)()" | py -x "dict([eval(x)])"

    Или так:
    cat logfile.log | py -x "'{{\"{0}\": \"{1}\"}}'.format(*x.split()) if x.split()[1:2] == ['has'] and x.split()[3:4] == ['calls'] else None"
    Ответ написан
  • Как поменять данные в 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
    Ответ написан
    Комментировать