json - python从json中提取特定键和值不起作用
问题描述
我正在尝试使用 Python 从 Windows 中的 json 中提取特定的键和值。
我想使用转储命令,但找不到一个很好的例子。
**更新数据:json文件的摘录是(但文件很长):
{
"CVE_data_type" : "CVE",
"CVE_data_format" : "MITRE",
"CVE_data_version" : "4.0",
"CVE_data_numberOfCVEs" : "64",
"CVE_data_timestamp" : "2020-01-09T08:00Z",
"CVE_Items" : [ {
"cve" : {
"data_type" : "CVE",
"data_format" : "MITRE",
"data_version" : "4.0",
"CVE_data_meta" : {
"ID" : "CVE-2020-0001",
"ASSIGNER" : "cve@mitre.org"
},
"problemtype" : {
"problemtype_data" : [ {
"description" : [ ]
} ]
},
"references" : {
"reference_data" : [ {
"url" : "https://source.android.com/security/bulletin/2020-01-01",
"name" : "https://source.android.com/security/bulletin/2020-01-01",
"refsource" : "CONFIRM",
"tags" : [ ]
} ]
},
"description" : {
"description_data" : [ {
"lang" : "en",
"value" : "In getProcessRecordLocked of ActivityManagerService.java isolated apps are not handled correctly. This could lead to local escalation of privilege with no additional execution privileges needed. User interaction is not needed for exploitation. Product: Android Versions: Android-8.0, Android-8.1, Android-9, and Android-10 Android ID: A-140055304"
} ]
}
},
"configurations" : {
"CVE_data_version" : "4.0",
"nodes" : [ ]
},
"impact" : { },
"publishedDate" : "2020-01-08T19:15Z",
"lastModifiedDate" : "2020-01-08T20:01Z"
}, {
"cve" : {
"data_type" : "CVE",
"data_format" : "MITRE",
"data_version" : "4.0",
"CVE_data_meta" : {
"ID" : "CVE-2020-0002",
"ASSIGNER" : "cve@mitre.org"
},
"problemtype" : {
"problemtype_data" : [ {
"description" : [ ]
} ]
},
"references" : {
"reference_data" : [ {
"url" : "https://source.android.com/security/bulletin/2020-01-04",
"name" : "https://source.android.com/security/bulletin/2020-01-04",
"refsource" : "CONFIRM",
"tags" : [ ]
} ]
},
"description" : {
"description_data" : [ {
"lang" : "en",
"value" : "In ih264d_init_decoder of ih264d_api.c, there is a possible out of bounds write due to a use after free. This could lead to remote code execution with no additional execution privileges needed. User interaction is needed for exploitation Product: Android Versions: Android-8.0, Android-8.1, Android-9, and Android-10 Android ID: A-142602711"
} ]
}
},
"configurations" : {
"CVE_data_version" : "4.0",
"nodes" : [ ]
},
...
我需要提取 ID 和描述。
我试过这个
for key, value in json.dumps(cve_dict['CVE_Items'][0], sort_keys=True, indent=4, separators=',', ': ')):
#if(key in ['ID', 'description']):
print(key, value)
但我得到这个错误:
File "unzip_get_info.py", line 19
for key, value in json.dumps(cve_dict['CVE_Items'][0], sort_keys=True, indent=4, separators=',', ': ')):
^
SyntaxError: invalid syntax
我可以让整个 json 打印出来:
print(json.dumps(cve_dict['CVE_Items'][0], sort_keys=True, indent = 4, separators=(',', ': ')))
我不是一个巨大的 Python 程序员。知道如何获取 ID 和描述的键/值吗?我尝试使用 cve_dict 直接执行此操作,但错误在于我无法直接执行此操作。
我会很感激帮助。这是我的第一个 python 程序。
我试图弄清楚如何使用此链接进行转储,但我没有看到它。我也看过这个,但我不确定。
**更新:我试过了
for key, value in cve_dict['CVE_Items'][0].items():
if(key in ['ID', 'description']):
print(key, value)
除了下面建议的内容外,还试图将其限制为 ID 和描述,但它没有打印任何内容。我知道 ID 和描述在那里(见上面的 json)。我如何只打印 ID 和描述,而不是所有键/值?
解决方案
当 dict 本身可以轻松遍历时,您不应该将 dict 转换为 JSON 字符串。只需使用以下命令访问所需的ID
密钥值:
cve_dict['CVE_Items'][0]['cve']['CVE_data_meta']['ID']
如果您想要所有 ID,您可以使用循环遍历列表项for
:
for item in cve_dict['CVE_Items']:
print(item['cve']['CVE_data_meta']['ID'])
推荐阅读
- mysql - SSL 连接错误:SSL_CTX_set_tmp_dh 失败
- vb6 - 如何解决运行时错误 53,未找到文件?
- javascript - 计算两个数组之间每个元素的数学差
- testng - 为什么TestNG中这个测试的执行顺序是这样的?
- python - 如何仅从 Google API 的嵌套 JSON 响应中获取特定值?
- ruby-on-rails - 避免迁移中的重复
- ruby-on-rails - rails activerecord where 子句如何接受动态参数?
- sql - 在存储过程中将 varchar 转换为数字时出错
- javascript - 将数据传递给 v-model
- kotlin - 为什么 mutableSet 不更新!用于 Kotlin 列表中的项目