как я могу перебрать все объекты в ответе json на python

#python #json

Вопрос:

Я довольно сильно бил головой о стену, пытаясь понять, почему я могу получить некоторые атрибуты, но не все в ответе json(на Python)

Например: при запуске кода в приведенной ниже функции 3 атрибута, которые я получаю здесь и успешно нашел(_id, состояние, тип и имя), находятся на том же уровне, что и некоторые другие атрибуты, однако, похоже, я не могу получить другие атрибуты. (См. Полный ответ json ниже функции.)

Значения, которые я не могу получить, относятся к scan_progress_status, parent_scan_id, parent_scan_type

 getScans = scans.get_scans()
scanResults = json.loads(getScans)
results = {}

for x in scanResults['scans']:
    results.update({x['_id'][0:]: {
       'state': x['state'],
       'name': x['name'],
       'type': x['type'],
       'parent_scan_id': x['parent_scan_id']
       
    }
})
y = json.dumps(results)
scanStates = cj.convert_pretty_json(y)

return scanStates
 

ответ

     {
  "scans": [
    {
      "_id": "60c40198152afeca2e5f2cfd",       
      "classification_is_enabled": true,       
      "connectorType": "rdb-postgresql",       
      "created_at": "2021-06-12T00:36:40.322Z",
      "customConnectorType": "default",        
      "ds_connection_name": "client_id_test",  
      "ds_location": null,
      "identityConnectionsUuid": [],
      "isDifferential": false,
      "isSampling": false,
      "name": "GenericScanner Subscan 1/1: client_id_test",
      "number_of_parsing_threads": 2,
      "origin": "client_id_test",
      "parent_scan_id": "60c40198152afeca2e5f2ce7",
      "parent_scan_type": "full_scan",
      "profile_id": null,
      "row_identifier_expression_is_disabled": false,
      "scanSecretKey": "masked0a0VT24aOvlg==",
      "scan_progress_status": {
        "Queued": "2021-06-12T00:36:40.322Z",
        "CollectingMetadata": "2021-06-12T00:36:44.239Z"
      },
      "scanner_group": "default",
      "scanner_type_group": "structured",
      "state": "CollectingMetadata",
      "structured_clustering_enabled": false,
      "type": "sub_scan",
      "updated_at": "2021-06-12T00:36:44.364Z",
      "startTimestamp": 1623458200354,
      "enumerationState": "Completed",
      "scan_enumeration_progress_status": {
        "Started": "2021-06-12T00:36:44.239Z",
        "Completed": "2021-06-12T00:36:44.364Z"
      },
      "scannerId": "4340cbb7-5949-4412-8ddf-afd36dd16d1c",
      "latestCollectionScanned": {
        "fullyQualifiedName": "client_id_test.public.clients",
        "totalRows": null,
        "totalRowsWithFindings": null
      },
      "scannedSize": 0,
      "totalCollections": 0,
      "totalEnumerated": 1,
      "totalFailedCollections": 0,
      "totalFindings": 0,
      "totalRows": 0,
      "totalRowsWithFindings": 0,
      "scan_parts_counter": {
        "New": 1
      }]}
 

Что делает parent_scan_id и некоторые другие достаточно разными, чтобы это могло привести к ключевым ошибкам?

Комментарии:

1. пожалуйста, проверьте опечатки. например x['state'] , и x['type'] отсутствует в ОТВЕТЕ json. кроме того, здесь отсутствует одна цитата x['parent_scan_id] . вы получаете ключевую ошибку? если да, пожалуйста, проверьте, присутствует ли это поле в JSON. остальное выглядит нормально в вашем коде.

2. Кроме того, отсутствуют квадратные и фигурные скобки. «ложь» должна быть «Ложью». «null» должно быть «Нет». Это может показаться придирчивым, но если ваши данные/код выполняются не так, как показано на рисунке, возникает вопрос, выполняется ли он для вас.

3. Это были просто мои опечатки, ответ, возвращающийся, действителен, похоже, я пропустил часть ответа в примере. Обновленный. Спасибо

4. Ответ на этот вопрос является действительным ответом веб-сервера. Мой вопрос не о сломанном ответе, я пытаюсь проанализировать этот ответ и вижу ключевые ошибки для некоторых атрибутов, но не для других. @RustyB

Ответ №1:

Ответом оказались атрибуты типа» parent_scan_id», в которых я получал ключевые ошибки, потому что у некоторых блоков не было этого атрибута.

Решение состояло в том, чтобы установить переменную в parent_scan_id, и если она существует, то обновите мой объект результатов

  for x in scanResults['scans']:
    parent_scan_id = x['parent_scan_id'] if 'parent_scan_id' in x else 'undefined'
    results.update({x['_id'][0:]: {
       'state': x['state'],
       'name': x['name'],
       'type': x['type'],
       'parent_scan_id': parent_scan_id
       
    }
})