python синтаксический анализ из массива json с повторяющимися именами (miter att & ck) - PullRequest
0 голосов
/ 11 июля 2020

Я новичок, пытаюсь проанализировать данные из репозитория файлов miter att & ck json и застрял на том, как анализировать данные для одного из полей - названий фаз атаки. Они хранятся в массиве, и иногда есть повторяющиеся имена, см. Ниже:

"type": "attack-pattern",
            "kill_chain_phases": [
                {
                    "kill_chain_name": "mitre-attack",
                    "phase_name": "persistence"
                },
                {
                    "kill_chain_name": "mitre-attack",
                    "phase_name": "privilege-escalation"
                }
            ],

Если я попытаюсь вернуть значения для get_phase(attack.kill_chain_phases[0].phase_name), python вернет только одно значение, когда иногда есть несколько значений, например, privilege-escalation

Если я попытаюсь повозиться и использовать что-то вроде этого get_phase(attack.kill_chain_phases[0].phase_name[0]), на выходе будет первый символ одного из имен фаз c

Если я попытаюсь сделать что-то вроде get_phase(attack_pattern.kill_chain_phases[1].phase_name) Я получаю ошибку вне индекса ...

Кто-нибудь знает, как я могу go использовать python для захвата этих полей? Также кто-нибудь знает, как описать этот формат данных и / или что я пытаюсь сделать, чтобы я мог попытаться найти решения? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Вы можете использовать для этого al oop. Получите родительский элемент элементов, для которых вы хотите найти все значения, а затем вы можете пройти l oop и получить все дочерние значения.

import json

json_string = """{
  "type": "attack-pattern",
  "kill_chain_phases": [
    {
      "kill_chain_name": "mitre-attack",
      "phase_name": "persistence"
    },
    {
        "kill_chain_name": "mitre-attack",
        "phase_name": "privilege-escalation"
    }
  ]
}
"""

parsed_json = json.loads(json_string)

# Loop through the parent "kill_chain_phases"
for kill_chain_phase in parsed_json["kill_chain_phases"]:
  # print out the children "phase_name" values
  print(kill_chain_phase["phase_name"]

Вы получите первый символ для get_phase(attack.kill_chain_phases[0].phase_name[0], потому что : get_phase(attack.kill_chain_phases[0].phase_name[0] = "persistence"

Python затем берет эту строку и обрабатывает ее как список: ["p", "e", "r", "s", "i", " s "," t "," e "," n "," c "," e "]

Итак, phase_name[0] покажет "p".

Надеюсь, что смысл.

Подробнее здесь

0 голосов
/ 11 июля 2020

Вероятно, вы ищете что-то вроде для l oop. Простой пример:

for attack in attack_pattern.kill_chain_phrases:

    get_phrase(attack)
...