@rsytrade

Как найти и забрать нужные данные из json?

Есть группа файлов примерно такого содержания:

{
  "responseHeader": {
    "zkConnected": true,
    "status": 0,
    "QTime": 394,
    "params": {
      "q": "+2019 +BUICK +ENCLAVE",
      "defType": "edismax",
      "qf": "title_en^200.0 title_es^200 title_ar^200 title_pt^200 title_ru^200 title_th^200 title_fr^200 title_ko^200 category_translated^150.0 category_translated_path^120.0 category_key_path^90.0 mmy^80.0 category_key^75",
      "fl": "imdocid,imcontent_text_id,path,title_ordered,category_key,file_type",
      "fq": [
        "channel:MANUALS",
        "file_type:application/pdf",
        " -(usergroup_key:[* TO *] OR -usergroup_key:PUBLIC)",
        " -(view_key:[* TO *] OR -view_key:PUBLIC)"
      ],
      "rows": "15",
      "_forwardedCount": "1",
      "stopwords": "true",
      "useParams": "default"
    }
  },
  "response": {
    "numFound": 3,
    "start": 0,
    "numFoundExact": true,
    "docs": [
      {
        "imdocid": "MA4840",
        "path": "/resources/sites/GMA/content/staging/MANUALS/4000/MA4840/en_US/7.0/GTK_2019_Buick_Enclave_84149417_A.pdf",
        "file_type": "application/pdf",
        "category_key": [
          "QUICK_REFERENCE_MANUALS_BROWSE",
          "BUICK",
          "ENCLAVE",
          "2019",
          "BUICK_INTELLILINK"
        ],
        "imcontent_text_id": "863d13356ad04f409b0d2b36061e63b1",
        "title_ordered": "Getting to Know Your 2019 Buick Enclave"
      },
      {
        "imdocid": "MA4284",
        "path": "/resources/sites/GMA/content/staging/MANUALS/4000/MA4284/en_US/2.0/19_BUI_Enclave_OM_en_US_U_84149412B_2018SEP12_2P.pdf",
        "file_type": "application/pdf",
        "category_key": [
          "OWNERS_MANUALS_BROWSE",
          "BUICK",
          "ENCLAVE",
          "2019"
        ],
        "imcontent_text_id": "b0640df8bc194096b65babf09543de11",
        "title_ordered": "2019 Buick Enclave Owner Manual"
      },
      {
        "imdocid": "MA4119",
        "path": "/resources/sites/GMA/content/staging/MANUALS/4000/MA4119/en_US/2.0/19_BUI_IM_en_US_U_84134605B_2018JUL03_2P.pdf",
        "file_type": "application/pdf",
        "category_key": [
          "INFOTAINMENT_MANUALS_BROWSE",
          "BUICK",
          "ENCLAVE",
          "REGAL",
          "ENVISION",
          "ENCORE",
          "2019",
          "BUICK_INTELLILINK"
        ],
        "imcontent_text_id": "09139b09b5004fe78bf59b574a8cb096",
        "title_ordered": "2019 Buick Infotainment System Manual"
      }
    ]
  }
}


Мне необходимо "вытащить" значения полей (если они есть, если их нет то пропустить):
['docs'][6]['path'] и ['docs'][6]['path']['category_key'][0]
если точнее то проверить, если в значении ключа category_key есть фраза OWNERS_MANUALS* то забрать значения ключа category_key и значения ключа path. При этом, вложенность может быть разная и OWNERS_MANUALS может быть не одно а 2,4,6 или вообще не быть.
Помогите, уже "голову" сломал, какие-то монстры получаются, но чувствую должно быть элегантное решение )
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Классический пример для решения рекурсией.
Проходите рекурсией по всей структуре, итерируясь по ключам или элементам списка. Если на одном уровне вложенности встречаете category_key, то запоминаете и path из того же уровня вложенности, если встречаете элемент типа dict или list - то вызываете сами себя с передачей данного элемента.
Ну и отбираете нужный category_key в списке которого будет OWNERS_MANUALS
Ответ написан
Комментировать
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Что значит разная вложенность?
Покажите какие монстры получаются и в чем конкретно проблема? Задача-то тривиальная: пройти циклом по списку, проверять условие и выдавать результаты через yeld, или собиать их в коллекцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы