将结构不一致的文本文件转换为项目数量不一致的JSON对象

时间:2019-07-17 20:44:33

标签: python json

我有这样一种文件结构,其中包含数百行数据:

RHSA-2019:1797 CVE-2017-17485,CVE-2018-12022,CVE-2018-12023,CVE-2018-14718,CVE-2018-14719,CVE-2018-19360,CVE-2018-19361,CVE-2018-19362 cpe:/a:redhat:jboss_bpms:6.4

数据中唯一的一致性是我要分离的3个字段之间的空格以及中间数据的逗号。标记为RHSA的第一种数据类型的项目数始终为1,标记为CVE的数据从1到20个项目以及标记为CPE的数据不等。

我尝试使用split()拆分字符串,但是我确定可以使用python在一个步骤中完成此操作,因为数据集的项目数量不一致,但结构不一致。

我使用

按空间划分数据
data = rh.split()
for temp in data:
    print(temp)

现在我有

RHSA-2019:1797 

CVE-2017-17485,CVE-2018-12022,CVE-2018-12023,CVE-2018-14718,CVE-201814719,CVE-2018-19360,CVE-2018-19361,CVE-2018-19362 


cpe:/a:redhat:jboss_bpms:6.4

其中每个数据集都位于单独的行上,因此理想情况下,我想每3行循环一次并将数据放入json中,如下所示:

[{"RHSA":{ "RHSA-2019:1797},
 {"CVE" :{ "CVE-2017-17485",
           "CVE-2018-12022",
           "CVE-2018-12023",
           "CVE-2018-14718",
           "CVE-2018-14719",
           "CVE-2018-19360",
           "CVE-2018-19361",
           "CVE-2018-19362" },
 {"CPE" :{ "cpe:/a:redhat:jboss_bpms:6.4"}]

1 个答案:

答案 0 :(得分:1)

您在示例中提供的JSON不是有效的JSON,但是此脚本会产生类似的内容:

line = 'RHSA-2019:1797 CVE-2017-17485,CVE-2018-12022,CVE-2018-12023,CVE-2018-14718,CVE-2018-14719,CVE-2018-19360,CVE-2018-19361,CVE-2018-19362 cpe:/a:redhat:jboss_bpms:6.4'

import re
from collections import defaultdict
import json

d = defaultdict(list)

for i in line.split():
    d[re.findall(r'^(\w+)', i)[0].upper()].extend(i.split(','))

print(json.dumps(d, indent=4))

打印:

{
    "RHSA": [
        "RHSA-2019:1797"
    ],
    "CVE": [
        "CVE-2017-17485",
        "CVE-2018-12022",
        "CVE-2018-12023",
        "CVE-2018-14718",
        "CVE-2018-14719",
        "CVE-2018-19360",
        "CVE-2018-19361",
        "CVE-2018-19362"
    ],
    "CPE": [
        "cpe:/a:redhat:jboss_bpms:6.4"
    ]
}