Ответы пользователя по тегу JSON
  • Как передать json файл из серверного файла app.js ( node.js ) в клиентский function.js, для обработки и вывода в html?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    fetch('data.json') выполняется на компьютере пользователя внутри его браузера, а файл вы сохранили в файловой системе сервера, в каталоге где запущено ваше приложение.
    fetch загружает контент по http с удалённого сервера, по умолчанию берется тот же хост, с которого получена страница со скриптом. Но этот сервер не отдаёт по http по пути имени этого файла этот файл. Для этого нужно либо создать соответствующий хендлер на сервере и настроить роутинг, либо положить файл в файловой системе так, чтобы его раздавал веб-сервер, который вы используете в качестве прокси, например nginx. Тогда вы сможете скачать клиентом этот файл.

    Но в любом случае выглядит всё так, будто бы вы собираетесь передать данные на клиент так, как это не следует делать.
    А как следует - это вы прочитаете в ближайшем учебнике. Не перепрыгивайте через главы.

    Это тривиальная задача, которую изучают все в самом начале изучения веб-разработки. Если вы хотите дойти до всего самостоятельно и изобрести пару квадратоколёсных велосипедов по пути - ваше право. Но трудно найти индивидуального репетитора, который будет вас учить таким азам, которые можно прочесть в книжке.
    Ответ написан
    Комментировать
  • Какие способы есть для расширяемого конвертера валют?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы можете добавить булев флаг "базовая единица", которая будет обозначать самую главную единицу измерения в своей группе. Кроме этого нужно добавить поля для указания ссылки на референсную единицу и коэффициент приведения к ней.
    Тогда
    1) у каждой единицы измерения будет всегда фиксированный набор атрибутов, и не надо редактировать все старые записи.
    2) в рамках своей группы всегда можно привести значение к базовой единице, а потом к искомой - всего два преобразования, а если одна из единиц конвертации базовая, то одно.
    Ответ написан
    Комментировать
  • Как подгрузить файл JSON в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Есть ещё один способ загружать неформатные файлы, похожие на json.
    Дело в том, что любой json файл представляет собой валидный yaml-файл.
    Но yaml гораздо боле гибкий формат, который "проглатывает" и ключи без кавычек, и трейлинговые запятые.
    Можно много спорить по поводу безопасности и корректности использования yaml для парсинга невалидных json, но иногда просто нет выхода и нужно обрабатывать огромное количество таких уже имеющихся файлов.
    import yaml
    with open('test.json', encoding='utf-8') as f:
        data = yaml.load(f, yaml.CSafeLoader)
    Ответ написан
    Комментировать
  • Ошибки в json python?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Проще всего опробовать загрузить такой битый файл кабудто это yaml. Любой Json-файл будет валидным yaml-файлом, но у формата yaml гораздо более гибкий парсер, менее требовательный к синтаксису.
    wrong_json = '{"name":"Максимальная дальность","unit":cH,"value":"invalid_key"}'
    print(yaml.load(wrong_json, yaml.BaseLoader))

    Загрузит нормально, но нужно проверять на реальных данных, могут возникнуть неожиданные побочные эффекты.
    Ответ написан
  • Как сохранить объект с кирилицей в файл формата JSON на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Спорим у вас винда?
    Прочитайте спецификацию функции open. В частности про параметр encoding.
    Когда записываете текст в виде байтов (а в файлах он именно так хранится), то нужно понимать какой кодировкой вы кодируете не ascii-символы.
    Вы явно не указываете кодировку, поэтому выбирается кодировка по умолчанию. Посмотреть что у вас там по умолчанию можно вот этой фунцией sys.getdefaultencoding()
    Именно в такой кодировке нужно открывать ваш файл на чтение, чтобы увидеть там русские буквы.
    В винде у вас скорее всего одна из двух кодировок там может быть. И она разная в зависимости от того в консоли вы запустили свою прогу, или в IDE. А ещё подстава - в винде по умолчанию однобайтовые кодировки, поэтому не все символы можно в них представить!
    С этим в линуксе гораpдо лучше. По умолчани везде utf-8.

    Вот, кстати, можете проверить что получится для понятности:
    > 'íåæèëîãî'.encode('latin1').decode('cp1251')
    'нежилого'
    Ответ написан
    1 комментарий
  • Как декодировать JSON содержащий кириллицу?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Прогоните его через утилиту jq, например.
    Или пайпом через такую команду:
    py "json.dumps(json.load(sys.stdin), ensure_ascii=False)" < encrypted.json > uncrypted.json
    Ответ написан
    Комментировать
  • Как найти и забрать нужные данные из json?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Что значит разная вложенность?
    Покажите какие монстры получаются и в чем конкретно проблема? Задача-то тривиальная: пройти циклом по списку, проверять условие и выдавать результаты через yeld, или собиать их в коллекцию.
    Ответ написан
    Комментировать
  • Как сопоставить цену с одного JSON к другому?

    trapwalker
    @trapwalker
    Программист, энтузиаст
     А в чем, собственно, проблема? Разделите строку с техникой на абзацы и ищите получившиеся строки в своём прайсе. Что представляет сложность для вас? Разбить строку по символу абзаца? Перебрать получившиеся элементы? Поискать каждый в словаре? Просуммировать найденные цены?
    Ответ написан
    Комментировать
  • С чем связанна проблема кодировки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ответ.
    Это может быть связано с неправильной работой с кодировками.
    А именно перекодирование происходит:
    - не в ту кодировку
    - не из той кодировки.
    Обычно неопытные программисты не хотят разбираться с тем как правильно работать с кодировками и что такое юникод, а все проблемы решают методом тыка меняя код пока проблема не исчезнет. Из-за этого у них часто присходят преобразования по умолчанию, которые ломаются при смене операционной системы, при запуске другим спообом (из терминала, от имени другого пользователя, через крон...), при смене умолчаний (локали, настроек терминала, настроек БД).
    А ещё такие неопытные программисты до жути боятся сообщений об ошибках, но решать настоящие пролемы не хотят и гасят их в бесшумном режиме, отчего реальные проблемы маскируются под глобальныйми молчаливыми пустыми обработчиками ошибок. Это приводит к усложнению внутреннего поведения программы и вот таки вот случаям, как у вас.
    Когда у таких программистов возникают проблемы (а за ними дело не встанет), то эти программисты не описывают проблему детально, не показывают исходный код, не обрисовывают архитектуру своей системы, а просто спрашивают в чем может быть проблема.
    Исчерпывающий ответ на такой вопрос дать несложно. Вот он.
    Ответ написан
    Комментировать
  • Как получить информацию из огромного json массива?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    получить информацию из огромного json массива

    Я уж думал у вас проблема с чтением действительно огромного JSON-файла. Такое бывает, когда файл не помещается в памяти, но из него что-то нужно достать. Приходится читать JSON-файл SAX-парсером, чтобы не помещать все данные в оперативку.
    Но тут поблема, очевидно, в другом.
    Нужно по нечетко поставленной задаче для автора вопроса написать код, который тривиально преобразует json более простую стркутуру.
    Просто автор вопроса не умеет, зато это не мешает ему писать бота.
    Вам стоит проследовать на биржу фриланса с этим вопросом, или свормулировать конкретно что именно вам не понятно.
    Ответ написан
    Комментировать
  • Где тут ошибка?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    UPD. Нет, пардон. JSON валидный на первом уровне:
    {'text': 'нажми на это сообщение',
     'bold': True,
     'color': 'dark_red',
     'clickEvent': {'action': 'run_command',
      'value': '/give @p written_book{pages:["{\\"text\\":\\"нажми на это сообщение\\",\\"bold\\":true,\\"color\\":\\"dark_red\\",\\"clickEvent\\":{\\"action\\":\\"run_command\\",\\"value\\":\\"/give @p oak_sign{BlockEntityTag:{Text1:\\\\\\"{\\\\\\\\\\\\\\"text\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"нажми на это сообщение\\\\\\\\\\\\\\",\\\\\\\\\\\\\\"bold\\\\\\\\\\\\\\":true,\\\\\\\\\\\\\\"color\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"dark_red\\\\\\\\\\\\\\",\\\\\\\\\\\\\\"clickEvent\\\\\\\\\\\\\\":{\\\\\\\\\\\\\\"action\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"run_command\\\\\\\\\\\\\\",\\\\\\\\\\\\\\"value\\\\\\\\\\\\\\":\\\\\\\\\\\\\\"/title @a title {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"text\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"ТЫ ПРИЁМНЫЙ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"bold\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":true,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"color\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"gold\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"}\\\\\\\\\\\\\\"}}\\\\\\",id:\\\\\\"Sign\\\\\\"}}\\"}}"],title:"Custom Book",author:Player}'}}

    А дальше разворачивайте сами=)
    Ответ написан
    Комментировать
  • Как записать .mp3 в JSON?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Хранить mp3 вполне логично в файлах в каталоге проекта.
    Если вы по какой-то причине не хотите хранить их россыпью в файловой системе, то можно собрать их в zip-файл без сжатия или в tar-архив. С ними можно работать не распаковывая, открыать и читать файлы внутри.
    Ещё есть встроенный модуль shelve - это персистентный key-value storage, который держит свои ключи и значения в одном файле. Доступны чтение и запись бинарных данных по ключу.
    Base64 приведёт к тому что объём данных увеличится примерно на четверть (на 25 процентов). Сериализация и десериализация больших файлов в текстовый json будет медленным и неэффективным.

    Опишите шире вашу задачу и вам предложат типовое ее решение.
    Ответ написан
  • Почему не могу распарсить JSON?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В чем ваша ошибка написано в сообщении о ней:
    Unexpected token p in JSON at position 0 at JSON.parse

    Там написано, что нулевой (это значит самый первый по счету) символ для парсера json оказался неожиданным. Его значение "p" - это указано тут же в этом сообщении. Теперь посмотрите что же у вас идёт первым символом в вашем, якобы, JSON'е:
    parseResults({"response":{"Header":

    Какая неожиданность! Это буква "p"!
    Вы пытаетесь распарсить то, что JSONом не является. Документ этого формата не может так начинаться.
    Ответ написан
    3 комментария
  • Как спарсить эту JSON страницу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    ну читайте же внимательно:
    print(json['result']['line'])
    TypeError: list indices must be integers or slices, not str

    json['result'] у вас это не словарь, а список, а к нему обращаться можно только по целочисленному индексу.
    print([item['line'] for item in json['result']])
    Ответ написан
    Комментировать
  • Как работать с большим JSON файлом?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Мне приходилось работать с JSON файлами по несколько гигов размером (6 - 7, если не изменяет память). Такой большой файл долго и монолитно грузится, плохо помещается в память в виде объектной модели, в общем так себе идея делать такие файлы, но поставщик данных предоставляет их именно в этом виде и работать надо.
    Поэтому я соорудил простенькую утилитку, которая представляет собой своеобразный SAX парсер, но для JSON.
    Утилита принимает огромный JSON в виде текстового потока данных, реагирует на открытие и закрытие тегов и выдаёт куски поэлементно в виде последовательности отдельных JSON строк, разделенных абзацами (в соответствии с RFC7464).
    С таким потоком небольших однотипных кусков справляться гораздо проще.
    Потом, кстати, мне подсказали, что известная и замечательная утилита JQ тоже умеет работать в таком режиме (SAX). Но свою задачу я уже к тому времени решил и в тонкости параметров командной строки для такого режима JQ не углублялся.
    Ответ написан
    Комментировать
  • Как отсортировать json как на JSON placeholder?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вам нужно сначала преобразовать свой файл (в котором, видимо на верхнем уровне список) в перечень вложенных в этот список json'ов:
    jq -c ".[]"
    Потом разбить на группы по N штук:
    split -l 10 -d - my_chunk_prefix_
    Получим файлы my_chunk_prefix_*, но в каждом из них не валидный json, a json-строки. Их нужно преобразовать к обычным josn'ам.
    for f in my_chunk_prefix_*; do cat $f | sed '1s/^/[/; $!s/$/,/; $s/$/]/' | jq "" > $f.json ; rm $f ; done


    Всё. На этом у вас есть пагинированный json-файл в виде статики.

    Итак, ещё раз:
    jq -c ".[]" my_big.json | split -l 10 -d - my_chunk_prefix_
    
    for f in my_chunk_prefix_*; do cat $f | sed '1s/^/[/; $!s/$/,/; $s/$/]/' | jq "" > $f.json ; rm $f ; done

    Так себе решение по читабельности, уверен, что сборку json из строк можно было сделать без sed на чистом jq, но читать мануал некогда.

    Если разбиение надо делать динамически, то большой json я бы хранил в виде одного большого jsons (json lines), потом сделал бы шелл-скрипт с параметрами пагинации и в нём выбирал бы нужные N строк по модулю количества элементов на страницу и конвертил бы это в json на лету.

    Вообще почитайте мануал по jq, не исключено, что там есть готовый способ сделать пагинацию за один простой шаг вместо всех этих танцев с башем.
    Наглядно поупражняться с магией jq можно тут: https://jqplay.org/.
    Ответ написан
    1 комментарий
  • Как сформировать вложенный json из структуры?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если событий у вас действительно много, то рекомендую вам не пихать их в один JSON, а воспользоваться вот таким форматом: jsonlines.org
    Это разделённые абзацами строки с JSON'ами.
    Этот формат не требуют огромного количества памяти (на весь датасет разом), его можно обрабатывать потоково.
    Но в задаче не сказано, что отдельные треки одного событий идут подряд и отдельные координаты одного трека тоже идут подряд. Поэтому рассчитывать на это не приходится.
    Уточните задачу и можно будет оптимизировать решение по памяти перейдя к потоковой выдаче.
    import struct
    import json
    
    filepath = 'hits.dat'
    events = {}
    with open(filepath, 'rb') as fp:
        buffer = fp.read(28)
        while len(buffer) == 28:
            event_id, track_id, x, y, z = struct.unpack(">HHddd", buffer)
            buffer = fp.read(28)
    
            event = events.setdefault(event_id, dict(event_id=event_id, tracks={}))        
            track = event['tracks'].setdefault(track_id, dict(coordinates=[]))
            track['coordinates'].append(dict(x=x, y=y, z=z))
    
    with open('hits.json', 'w') as fp:
        json.dump(events, fp, indent=2)

    Файла у меня вашего нет, поэтому писал на ощупь. Проверяйте.
    У вас, кстати, ошибка в примере JSON'а.
    Нужно так:
    events = {
        1: {
            'event_id': 1,
            'tracks': {
                1: {        
                    'track_id': 1,
                    'coordinates': [
                        {'x': 1, 'y': 2, 'z': 3},
                        {'x': 4, 'y': 5, 'z': 6}
                    ]
                },
                2: {
                    'track_id': 2,
                    'coordinates': [
                        {'x': 12, 'y': 22, 'z': 33},
                        {'x': 44, 'y': 55, 'z': 66}
                    ]
                }
    
            }
        }
    }
    Ответ написан
  • Как в JSON выбрать все имена?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нифига из условия задачи не ясно. Я понял вас так:
    echo '[{"name": "ha-collector-data-test1"}, {"name": "ha-collector-data-test2"}]' | py "[item['name'] for item in json.load(sys.stdin) if item['name'].startswith('ha-collector-data-')]"

    Или из питоновского кода:
    import json
    
    FILTER='[{"name": "ha-collector-data-test1"}, {"name": "ha-collector-data-test2"}, {"name": "ha-collector-data-test3"}]'
    filter_data = json.loads(FILTER)
    items = [
        item['name']
        for item in filter_data
        if item['name'].startswith('ha-collector-data-')
    ]
    Ответ написан
  • Какой программой можно быстро сделать из json в csv?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    import csv
    import sys
    import typing
    import json
    
    
    def deep_walk(j, path=()):
        if isinstance(j, dict):
            for k, v in j.items():
                yield from deep_walk(v, path + (f'.{k}',))
        elif isinstance(j, list):
            for i, v in enumerate(j):
                yield from deep_walk(v, path + (f'[{i}]',))
        else:
            yield path, j
    
    
    def json2csv(data: typing.Union[dict, list], dest: typing.TextIO = None):
        field_set = set()
        records = []
        if isinstance(data, dict):
            data = [data]
    
        for item in data:
            record = {''.join(path).lstrip('.'): value for path, value in deep_walk(item)}
            records.append(record)
            field_set.update(record.keys())
    
        w = csv.DictWriter(dest or sys.stdout, fieldnames=list(sorted(field_set)))
        w.writeheader()
        w.writerows(records)
    
    
    if __name__ == '__main__':
        if sys.argv[1:]:
            with open(sys.argv[1]) as f:
                json2csv(json.load(f))
        else:
            json2csv(json.load(sys.stdin))

    Входной json можно передать в виде имени файла первым параметром или отправить его программе через stdin.

    Запостил чтобы показать, что такие вещи - не "рокет сайнс". Просто нужно чуточку подумать и сделать.
    А вот как сделать, чтобы прога не нуждалась в загрузке всего входного 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"
    Ответ написан