【问题标题】:python parse from a json array with duplicate names (mitre att&ck)python从具有重复名称的json数组中解析(mitre att&ck)
【发布时间】:2020-07-10 21:16:28
【问题描述】:

我是一名新手,试图从 miter att&ck json 文件的 repo 中解析数据,但我一直坚持如何解析其中一个字段的数据 - 攻击阶段名称。它们存储在一个数组中,有时会有重复的名称,见下文:

"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) 之类的操作,则会出现索引不足错误...

有没有人知道如何使用 python 来获取这些字段?还有谁知道如何描述这种数据格式和/或我正在尝试做什么,以便我可以尝试搜索解决方案?提前致谢!

【问题讨论】:

    标签: python json parsing


    【解决方案1】:

    您可能正在寻找类似for loop 的东西。一个简单的例子是这样的:

    for attack in attack_pattern.kill_chain_phrases:
    
        get_phrase(attack)
    

    【讨论】:

      【解决方案2】:

      您需要为此使用循环。获取要查找所有值的项的父项,然后您可以循环并获取所有子项的值。

      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] = "持久性"

      Python 然后获取该字符串并将其视为一个列表: [“p”、“e”、“r”、“s”、“i”、“s”、“t”、“e”、“n”、“c”、“e”]

      所以phase_name[0] 将显示"p"

      希望这是有道理的。

      更多信息here

      【讨论】:

      • 感谢您的额外解释和示例,这很有意义。我很高兴能尝试一下!
      • 没问题,如果您对此处有关堆栈溢出的答案之一感到满意,请标记一个答案,以便其他用户找到他们正在寻找的帮助。
      • 我可能在这里做错了 - 我不得不重写它以使用我的 stix2 过滤器的结果。仍然当我尝试将函数重写为 for 循环时,出现属性错误: AttributeError: 'list' object has no attribute 'phase_name' ``` def get_phase(killchain, phase_name): for phase_name in killchain: return(phase_name )```和```get_phase(attack_pattern.kill_chain_phases,attack_pattern.kill_chain_phases.phase_name)```
      • @cookiesmonster14 我认为这与 Json 字符串的输入方式有关。当您将 json_string 打印出来时,您会得到什么?您是要从文件中还是从 Web url 中提取它?打印(json_string)
      • @cookiesmonster14 我刚刚又试了一次。我第一次运行它时遇到了这个错误,然后它就消失了。不知道为什么会这样...如果您可以编辑您的帖子并添加您遇到问题的代码,我可以为您提供更多帮助。
      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2020-08-09
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      相关资源
      最近更新 更多