json用python解析 - 嵌套数组

时间:2018-06-07 14:41:19

标签: python json

我正在尝试解析以下json文件:https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2017.json.gz

我正在尝试迭代一个嵌套字段,但它会抛出错误。如何在“配置”中对对象进行正确迭代?

json文件的部分示例:

{
  "CVE_data_type" : "CVE",
  "CVE_data_format" : "MITRE",
  "CVE_data_version" : "4.0",
  "CVE_data_numberOfCVEs" : "4337",
  "CVE_data_timestamp" : "2018-06-06T07:00Z",
  "CVE_Items" : [ {
    "cve" : {
      "data_type" : "CVE",
      "data_format" : "MITRE",
      "data_version" : "4.0",
      "CVE_data_meta" : {
        "ID" : "CVE-2018-0001",
        "ASSIGNER" : "cve@mitre.org"
      },
      "affects" : {
        "vendor" : {
          "vendor_data" : [ {
            "vendor_name" : "juniper",
            "product" : {
              "product_data" : [ {
                "product_name" : "junos",
                "version" : {
                  "version_data" : [ {
                    "version_value" : "12.1x46"
                  }, {
                    "version_value" : "12.3"
                  }, {
                    "version_value" : "12.3x48"
                  }, {
                    "version_value" : "14.1"
                  }, {
                    "version_value" : "14.1x53"
                  }, {
                    "version_value" : "14.2"
                  }, {
                    "version_value" : "15.1"
                  }, {
                    "version_value" : "15.1x49"
                  }, {
                    "version_value" : "15.1x53"
                  } ]
                }
              } ]
            }
          } ]
        }
      },
      "problemtype" : {
        "problemtype_data" : [ {
          "description" : [ {
            "lang" : "en",
            "value" : "CWE-416"
          } ]
        } ]
      },
      "references" : {
        "reference_data" : [ {
          "url" : "http://www.securityfocus.com/bid/103092",
          "name" : "103092",
          "refsource" : "BID"
        }, {
          "url" : "http://www.securitytracker.com/id/1040180",
          "name" : "1040180",
          "refsource" : "SECTRACK"
        }, {
          "url" : "https://kb.juniper.net/JSA10828",
          "name" : "https://kb.juniper.net/JSA10828",
          "refsource" : "CONFIRM"
        } ]
      },
      "description" : {
        "description_data" : [ {
          "lang" : "en",
          "value" : "A remote, unauthenticated attacker may be able to execute code by exploiting a use-after-free defect found in older versions of PHP through injection of crafted data via specific PHP URLs within the context of the J-Web process. Affected releases are Juniper Networks Junos OS: 12.1X46 versions prior to 12.1X46-D67; 12.3 versions prior to 12.3R12-S5; 12.3X48 versions prior to 12.3X48-D35; 14.1 versions prior to 14.1R8-S5, 14.1R9; 14.1X53 versions prior to 14.1X53-D44, 14.1X53-D50; 14.2 versions prior to 14.2R7-S7, 14.2R8; 15.1 versions prior to 15.1R3; 15.1X49 versions prior to 15.1X49-D30; 15.1X53 versions prior to 15.1X53-D70."
        } ]
      }
    },
    "configurations" : {
      "CVE_data_version" : "4.0",
      "nodes" : [ {
        "operator" : "OR",
        "cpe" : [ {
          "vulnerable" : true,
          "cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d10",
          "cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d10:*:*:*:*:*:*"
        }, {
          "vulnerable" : true,
          "cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d15",
          "cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d15:*:*:*:*:*:*"
        }, {
          "vulnerable" : true,
          "cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d20",
          "cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d20:*:*:*:*:*:*"
        }, {
          "vulnerable" : true,
          "cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d25",
          "cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d25:*:*:*:*:*:*"
        }, {
          "vulnerable" : true,

Python代码:

#!/usr/bin/python
    # -*- coding: utf-8 -*-

    import sys
    import json

    def main():
            if len(sys.argv) > 1:
                    input_file = sys.argv[1]
            else:
                    print 'Usage: %s <nvd-xml-file>' % sys.argv[0]
                    sys.exit(1)
            fh = open(input_file)
            json_data = json.load(fh)
            for m in json_data['CVE_Items']:
                    stuff = m['configurations']
                    for n in stuff['nodes']:
                            oper = n['operator']
                            cpe = n['cpe']
                            print oper, cpe

    if __name__ == '__main__':
        main()

我收到了以下输出和错误:

$python parsingconf.py nvdcve-1.0-2018.json 
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d15', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d15:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d30:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d35', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d35:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d40', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d40:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d45', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d45:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d50', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d50:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d55', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d55:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d60', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d60:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d65', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d65:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d15', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d15:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d30:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x49:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x49:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x49:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x49:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x49:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x49:d30:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d21', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d21:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d30:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d32', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d32:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d33', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d33:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d34', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d34:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d60', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d60:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d61', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d61:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d62', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d62:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d63', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d63:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:14.1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:*:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r2:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r3:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r4', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r4:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r8', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r8:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r9', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r9:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r2:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r3:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r4', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r4:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r5', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r5:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r7', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r7:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r8', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r8:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:15.1:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1:r2:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:12.3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:*:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r2:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r3:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r4', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r4:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r5', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r5:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r6', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r6:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r7', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r7:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r8', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r8:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r9', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r9:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:*:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d15', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d15:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d16', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d16:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d26', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d26:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d27', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d27:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d35', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d35:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d50', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d50:*:*:*:*:*:*', u'vulnerable': True}]
Traceback (most recent call last):
  File "parsingconf.py", line 23, in <module>
    main()
  File "parsingconf.py", line 19, in main
    cpe = n['cpe']
KeyError: 'cpe'

2 个答案:

答案 0 :(得分:0)

正如@L3viathan评论的那样,节点的一个条目没有密钥cpe。如果他们都应该拥有此密钥,那么数据响应可能已被破坏或不完整。只需将响应包装在try块中即可。

#!/usr/bin/python
    # -*- coding: utf-8 -*-

    import sys
    import json

    def main():
            if len(sys.argv) > 1:
                    input_file = sys.argv[1]
            else:
                    print 'Usage: %s <nvd-xml-file>' % sys.argv[0]
                    sys.exit(1)
            fh = open(input_file)
            json_data = json.load(fh)
            for m in json_data['CVE_Items']:
                    stuff = m['configurations']
                    for n in stuff['nodes']:
                            try:
                                oper = n['operator']
                                cpe = n['cpe']
                                print oper, cpe
                            except KeyError, e:
                                print 'I got a KeyError - reason "%s"' % str(e)

    if __name__ == '__main__':
        main()

答案 1 :(得分:0)

当您不确定要解析的数据的有效性时,使用action()始终是一个好习惯。

如果任何节点都没有'cpe',

cpe = n.get('cpe', 'some default value')会给出关键错误。