python извлечение спецификации c ключ и значение из json не работают - PullRequest
3 голосов
/ 09 января 2020

Я пытаюсь извлечь указанный c ключ и значение из json в windows с помощью Python.

Я бы хотел использовать команду dumps, но не могу найти хороший пример.

** Обновленные данные: извлечение из файла json (но файл очень длинный):

   {
  "CVE_data_type" : "CVE",
  "CVE_data_format" : "MITRE",
  "CVE_data_version" : "4.0",
  "CVE_data_numberOfCVEs" : "64",
  "CVE_data_timestamp" : "2020-01-09T08:00Z",
  "CVE_Items" : [ {
    "cve" : {
      "data_type" : "CVE",
      "data_format" : "MITRE",
      "data_version" : "4.0",
      "CVE_data_meta" : {
        "ID" : "CVE-2020-0001",
        "ASSIGNER" : "cve@mitre.org"
      },
      "problemtype" : {
        "problemtype_data" : [ {
          "description" : [ ]
        } ]
      },
      "references" : {
        "reference_data" : [ {
          "url" : "https://source.android.com/security/bulletin/2020-01-01",
          "name" : "https://source.android.com/security/bulletin/2020-01-01",
          "refsource" : "CONFIRM",
          "tags" : [ ]
        } ]
      },
      "description" : {
        "description_data" : [ {
          "lang" : "en",
          "value" : "In getProcessRecordLocked of ActivityManagerService.java isolated apps are not handled correctly. This could lead to local escalation of privilege with no additional execution privileges needed. User interaction is not needed for exploitation. Product: Android Versions: Android-8.0, Android-8.1, Android-9, and Android-10 Android ID: A-140055304"
        } ]
      }
    },
    "configurations" : {
      "CVE_data_version" : "4.0",
      "nodes" : [ ]
    },
    "impact" : { },
    "publishedDate" : "2020-01-08T19:15Z",
    "lastModifiedDate" : "2020-01-08T20:01Z"
  }, {
    "cve" : {
      "data_type" : "CVE",
      "data_format" : "MITRE",
      "data_version" : "4.0",
      "CVE_data_meta" : {
        "ID" : "CVE-2020-0002",
        "ASSIGNER" : "cve@mitre.org"
      },
      "problemtype" : {
        "problemtype_data" : [ {
          "description" : [ ]
        } ]
      },
      "references" : {
        "reference_data" : [ {
          "url" : "https://source.android.com/security/bulletin/2020-01-04",
          "name" : "https://source.android.com/security/bulletin/2020-01-04",
          "refsource" : "CONFIRM",
          "tags" : [ ]
        } ]
      },
      "description" : {
        "description_data" : [ {
          "lang" : "en",
          "value" : "In ih264d_init_decoder of ih264d_api.c, there is a possible out of bounds write due to a use after free. This could lead to remote code execution with no additional execution privileges needed. User interaction is needed for exploitation Product: Android Versions: Android-8.0, Android-8.1, Android-9, and Android-10 Android ID: A-142602711"
        } ]
      }
    },
    "configurations" : {
      "CVE_data_version" : "4.0",
      "nodes" : [ ]
    },

    ...

Мне нужно извлечь идентификатор и описание.

Я пытался это

for key, value in json.dumps(cve_dict['CVE_Items'][0], sort_keys=True, indent=4, separators=',', ': ')):
    #if(key in ['ID', 'description']):
    print(key, value)

Но я получаю эту ошибку:

  File "unzip_get_info.py", line 19
    for key, value in json.dumps(cve_dict['CVE_Items'][0], sort_keys=True, indent=4, separators=',', ': ')):
                                                                                                          ^
SyntaxError: invalid syntax

Я могу получить целое json, чтобы распечатать это:

print(json.dumps(cve_dict['CVE_Items'][0], sort_keys=True, indent = 4, separators=(',', ': ')))

Я не большой python программист. Любая идея, как я могу получить ключ / значение идентификатора и описания? Я пытался сделать это напрямую с помощью cve_dict, но ошибка была в том, что я не могу сделать это напрямую.

Буду признателен за помощь. Это моя первая python программа.

Я пытаюсь выяснить, как это сделать с дампами с помощью этой ссылки , но я ее не вижу. Я посмотрел , это тоже , но я не уверен.

** Обновление: я пытался

for key, value in cve_dict['CVE_Items'][0].items():
    if(key in ['ID', 'description']):
        print(key, value)

, пытаясь ограничить его идентификатором и описанием, в дополнение к тому, что было предложено ниже, но это ничего не печатает. Я знаю, что ID и описание там (см. json выше). Как мне просто напечатать идентификатор и описание, а не все ключи / значения?

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Вы не должны преобразовывать dict в строку JSON, когда сам dict может быть легко пройден. Просто перейдите к нужному значению клавиши ID с помощью:

cve_dict['CVE_Items'][0]['cve']['CVE_data_meta']['ID']

Если вы хотите, чтобы все идентификаторы можно было перебирать в элементах списка с помощью for l oop:

for item in cve_dict['CVE_Items']:
    print(item['cve']['CVE_data_meta']['ID'])
0 голосов
/ 09 января 2020

Не могли бы вы попробовать перебрать dict:

for k, v in cve_dict['CVE_Items'][0].items():
    print(k, v)

json.dumps - это преобразование dict обратно в строку, а не python объект для перебора,

...