LINUX.ORG.RU

Парсинг JSON в python

 , ,


1

1

Привет ЛОР,

Я не очень сведущ в питоне.

Есть один JSON, получаемый с помощью requests:

   "tracks":[
      {
         "bframes":0,
         "bitrate":155,
         "codec":"h264",
         "content":"video",
         "fps":25.0,
         "gop_size":25,
         "height":240,
         "last_gop":25,
         "level":"2.1",
         "pix_fmt":"yuv420p",
         "pixel_height":240,
         "pixel_width":320,
         "profile":"Baseline",
         "sar_height":1,
         "sar_width":1,
         "track_id":"v1",
         "width":320
      },
      {
         "bitrate":28,
         "channels":2,
         "codec":"aac",
         "content":"audio",
         "lang":"eng",
         "sample_rate":48000,
         "track_id":"a1"
      }
   ]
}

Как я получаю и конвертирую этот JSON:

        media_info_data = []
        media_info = requests.get<не_скажу_куда>
        media_data = json.loads(media_info.text)
        media_info_data.append(media_data)

Из него мне надо выдернуть, например, fps, gop и lang.

Пытался выдернуть fps следующим способом:

        List=[]
        file = open("resp_text.txt", "w")
        file.write(media_info.text)
        with open('resp_text.txt') as f:
            for jsonObj in f:
                media_data = json.loads(jsonObj)
                List.append(media_data)
        print ("Printing each JSON Decoded Object")
        for row in List:
            print (fps["fps"])

Однако, получаю

TypeError: list indices must be integers or slices, not str

И как бы я ни пытался бы играться с индексами, получить нужные поля никак не могу.

Насколько я ещё понимаю, это multiroot json. Т.е. обычный парсинг json тут не сработает:

    name = []
    for i in streams_data['streams']:
        po = i['name']
        name.append(po)
Mamin_simpotyaga ()
Ответ на: комментарий от Mamin_simpotyaga

Не виду в примере никакого multiroot, вижу что ты пропустил начало словаря, в примере json и два куска несвязанного кода с ошибками, и третий кусок непонятно к чему в комментарии.

Если ты скачаешь json как в примере и добавишь в массив, то до fps можно будет достучаться так: media_info_data[0]['tracks'][0]['fps']. Откуда взялся fps у тебя не написано, и что за файл с json строками тоже не ясно, что за streams_data[‘streams’] одному Сатане известно.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
  1. Ты что, для того что бы выдернуть данные из json сначала сохраняешь его в файл? Просто сделай response.json()['нужный тебе ключ']
  2. ты каждую строку из файла читаешь как json. А если у тебя media_info.text переводом строки заканчивается?
  3. ты одновременно открываешь один файл на чтение и запись разными хендлерами и открытие на запись без with. Фу таким быть.
        file = open("resp_text.txt", "w")
        file.write(media_info.text)
        with open('resp_text.txt') as f:
            for jsonObj in f:
                media_data = json.loads(jsonObj)
                List.append(media_data)
        print ("Printing each JSON Decoded Object")
        for row in List:
            print (fps["fps"])
Aswed ★★★★★ ()

Ну и ошибка у тебя очевидно в print (fps["fps"]) потому что это единственное место с индексацией в твоем коде. Почему ошибка? Ну ты записал в одну из строк не словарь а текстовую строку.

Aswed ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей