首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ijson从json文件中提取一组对应的数据?

如何使用ijson从json文件中提取一组对应的数据?
EN

Stack Overflow用户
提问于 2021-05-02 19:38:07
回答 1查看 23关注 0票数 0

我有一个json文件,就像这样:

代码语言:javascript
复制
    {
  "CVE_data_type" : "CVE",
  "CVE_Items" : [ {
    "cve" : {

      "CVE_data_meta" : {
        "ID" : "CVE-2020-0001",
        "ASSIGNER" : "security@android.com"
      },
      ...
      
    "configurations" : {
      "CVE_data_version" : "4.0",
      "nodes" : [ {
        "operator" : "OR",
        "children" : [ ],
        "cpe_match" : [ {
          "vulnerable" : true,
          "cpe23Uri" : "cpe:2.3:o:google:android:8.0:*:*:*:*:*:*:*",
          "cpe_name" : [ ]
        }, {
          "vulnerable" : true,
          "cpe23Uri" : "cpe:2.3:o:google:android:8.1:*:*:*:*:*:*:*",
          "cpe_name" : [ ]
        }]
      } ]
    },
   ...
    "publishedDate" : "2020-01-08T19:15Z",
    "lastModifiedDate" : "2020-01-14T21:52Z"
  }]
}

我想提取CVE-ID和相应的CPE,这样我就可以通过CPE创建CVE-ID,下面是我的代码

代码语言:javascript
复制
import ijson
import datetime


def parse_json(filename):
    with open(filename, 'rb') as input_file:
        CVEID = ijson.items(input_file, 'CVE_Items.item.cve.CVE_data_meta.ID', )
        for id in CVEID:
            print("CVE id: %s" % id)
        # for prefix, event, value in parser:
        #     print('prefix={}, event={}, value={}'.format(prefix, event, value))

    with open(filename, 'rb') as input_file:
        cpes = ijson.items(input_file, 'CVE_Items.item.configurations.nodes.item.cpe_match.item', )
        for cpe in cpes:
            print("cpe: %s" % cpe['cpe23Uri'])


def main():
    
    parse_json("cve.json")
    end = datetime.datetime.now()
    

if __name__ == '__main__':
    main()

结果:

代码语言:javascript
复制
CVE id: CVE-2020-0633
CVE id: CVE-2020-0631
cpe: cpe:2.3:o:google:android:8.0:*:*:*:*:*:*:*
cpe: cpe:2.3:o:google:android:10.0:*:*:*:*:*:*:*
cpe: cpe:2.3:o:microsoft:windows_10:1607:*:*:*:*:*:*:*
cpe: cpe:2.3:o:microsoft:windows_server_2016:-:*:*:*:*:*:*:*

但在这上面只提取数据,没有对应关系。

有人能帮上忙吗?如果能帮上一点忙,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-02 22:59:45

我认为,如果您需要跟踪CVE及其对应的CVE,则需要遍历整个cve项并提取所需的数据位(因此,您只需遍历该文件一次)。虽然在内存方面不如最初的迭代高效,但如果CVE_Items中的每一项都不太大,那么这就不是问题:

代码语言:javascript
复制
with open(filename, 'rb') as input_file:
    for cves in ijson.items(input_file, 'CVE_Items.item')
        cve_id = cve['cve']['CVE_data_meta']['ID']
        cpes = [match
                for node in cve['configurations']['nodes']
                for match in node['cpe_match']]

如果您知道nodes中始终只有一个cpe_match元素,那么您可以用cve['configurations']['nodes'][0]['cpe_match']替换最后一个列表理解

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67355915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档