使用新字典的Python json.dumps未返回有效的json格式

使用新字典的Python json.dumps未返回有效的json格式,python,json,formatting,Python,Json,Formatting,我目前正在使用一个python模块,该模块使用tenable API从tenable导出资产数据。export函数返回一个“ExportIterator”类型的对象以遍历导出结果 从本质上讲,每个资产返回的数据太多,我很难弄清楚如何过滤出返回的数据以便使用它 这将返回数千个json对象,其中包含数百个键(我已经删除并混淆了几个键),如下所示: { "id": "1a2b3c", "has_plugin_results":

我目前正在使用一个python模块,该模块使用tenable API从tenable导出资产数据。export函数返回一个“ExportIterator”类型的对象以遍历导出结果

从本质上讲,每个资产返回的数据太多,我很难弄清楚如何过滤出返回的数据以便使用它

这将返回数千个json对象,其中包含数百个键(我已经删除并混淆了几个键),如下所示:

{
    "id": "1a2b3c",
    "has_plugin_results": true,
    "created_at": "xxx",
    "terminated_at": null,
    "terminated_by": null,
    "updated_at": "xxx",
    "deleted_at": null,
    "deleted_by": null,
    "first_seen": "",
    "last_seen": "",
    "first_scan_time": "xxx",
    "last_scan_time": "xxx",
    "last_authenticated_scan_date": "xxx",
    "last_licensed_scan_date": "xxx,
    "last_scan_id": "xxx,
    "last_schedule_id": "xxx",
    "azure_vm_id": null,
    "azure_resource_id": null,
    "gcp_project_id": null,
    "gcp_zone": null,
    "gcp_instance_id": null,
    "aws_ec2_instance_ami_id": null,
    "aws_ec2_instance_id": null,
    "agent_uuid": "xxx",
    "bios_uuid": "xxx",
    "network_id": "xxx",
    "network_name": "Default",
    "aws_owner_id": null,
    "aws_availability_zone": null,
    "aws_region": null,
    "aws_vpc_id": null,
    "aws_ec2_instance_group_name": null,
    "aws_ec2_instance_state_name": null,
    "aws_ec2_instance_type": null,
    "aws_subnet_id": null,
    "aws_ec2_product_code": null,
    "aws_ec2_name": null,
    "mcafee_epo_guid": "{xxx}",
    "mcafee_epo_agent_guid": "{xxx}",
    "servicenow_sysid": null,
    "agent_names": [
        "aaabbbccc123"
    ],
    "installed_software": [],
    "ipv4s": [
        "1.1.1.1",
        "2.2.2.2"
    ],
    "ipv6s": [],
    "fqdns": [
        "aaabbbbccc"
    ],
    "mac_addresses": [
        "aa:bb:cc"
    ],
    "netbios_names": [
        "aaabbbccc123"
    ],
    "operating_systems": [
        "foobar 10"
    ],
    "system_types": [
        "general-purpose"
    ],
    "hostnames": [
        "aaabbbccc123"
    ],
    "sources": [
        {
            "name": "AGENT",
            "first_seen": "xxx",
            "last_seen": "xxx"
        }
    ],
}
[
      {
        "vmName":"aaabbbccc123"
      },
      {
        "vmName":"dddeeefff123"
      },
      {
        "vmName":"ggghhhiii123"
      },
      {
        "vmName":"jjjkkklll123"
      }
]
此导出模块函数不支持任何过滤json对象本身的参数

要进行筛选,我使用它将“hostnames”:值映射到新词汇中名为“vmName”的新键:

from tenable.io import TenableIO
import json

tio = TenableIO()

wr = open('tioasset.json','w')

for asset in tio.exports.assets():
    new_data = {'vmName' : asset['hostnames'],},
    wr.write(json.dumps(new_data, indent = 2, separators=(',', ':')))

wr.close()
这会从api响应中删除所有不必要的键,但格式似乎完全错误:

代码的输出:

][
  {
    "vmName":[
      "aaabbbccc123"
    ]
  }
][
  {
    "vmName":[
      "dddeeefff123"
    ]
  }
][
  {
    "vmName":[
      "ggghhhiii123"
    ]
  }
][
  {
    "vmName":[
      "jjjkkklll123"
    ]
  }
][
  {
    "vmName":[
      "mmmnnooo123"
    ]
  }
][
你知道如何让代码返回格式正确的json数据字典吗?大概是这样的:

{
    "id": "1a2b3c",
    "has_plugin_results": true,
    "created_at": "xxx",
    "terminated_at": null,
    "terminated_by": null,
    "updated_at": "xxx",
    "deleted_at": null,
    "deleted_by": null,
    "first_seen": "",
    "last_seen": "",
    "first_scan_time": "xxx",
    "last_scan_time": "xxx",
    "last_authenticated_scan_date": "xxx",
    "last_licensed_scan_date": "xxx,
    "last_scan_id": "xxx,
    "last_schedule_id": "xxx",
    "azure_vm_id": null,
    "azure_resource_id": null,
    "gcp_project_id": null,
    "gcp_zone": null,
    "gcp_instance_id": null,
    "aws_ec2_instance_ami_id": null,
    "aws_ec2_instance_id": null,
    "agent_uuid": "xxx",
    "bios_uuid": "xxx",
    "network_id": "xxx",
    "network_name": "Default",
    "aws_owner_id": null,
    "aws_availability_zone": null,
    "aws_region": null,
    "aws_vpc_id": null,
    "aws_ec2_instance_group_name": null,
    "aws_ec2_instance_state_name": null,
    "aws_ec2_instance_type": null,
    "aws_subnet_id": null,
    "aws_ec2_product_code": null,
    "aws_ec2_name": null,
    "mcafee_epo_guid": "{xxx}",
    "mcafee_epo_agent_guid": "{xxx}",
    "servicenow_sysid": null,
    "agent_names": [
        "aaabbbccc123"
    ],
    "installed_software": [],
    "ipv4s": [
        "1.1.1.1",
        "2.2.2.2"
    ],
    "ipv6s": [],
    "fqdns": [
        "aaabbbbccc"
    ],
    "mac_addresses": [
        "aa:bb:cc"
    ],
    "netbios_names": [
        "aaabbbccc123"
    ],
    "operating_systems": [
        "foobar 10"
    ],
    "system_types": [
        "general-purpose"
    ],
    "hostnames": [
        "aaabbbccc123"
    ],
    "sources": [
        {
            "name": "AGENT",
            "first_seen": "xxx",
            "last_seen": "xxx"
        }
    ],
}
[
      {
        "vmName":"aaabbbccc123"
      },
      {
        "vmName":"dddeeefff123"
      },
      {
        "vmName":"ggghhhiii123"
      },
      {
        "vmName":"jjjkkklll123"
      }
]

这是因为主机名是一个数组: 如果您想要只取第一个元素(只需替换此元素):

或者,如果每个阵列中有多个主机名,则可以执行此操作:

for asset in tio.exports.assets():
    for a in asset['hostnames']:
        new_data = {'vmName' : a,},
        wr.write(json.dumps(new_data, indent = 2, separators=(',', ':')))

这是因为主机名是一个数组: 如果您想要只取第一个元素(只需替换此元素):

或者,如果每个阵列中有多个主机名,则可以执行此操作:

for asset in tio.exports.assets():
    for a in asset['hostnames']:
        new_data = {'vmName' : a,},
        wr.write(json.dumps(new_data, indent = 2, separators=(',', ':')))
wr.close()


wr.close()

在运行此操作后,我只返回了一个主机名,而在运行此操作之前,返回了数百个主机名。在运行此操作后,我只返回了一个主机名,而在返回了数百个主机名之前,返回了数百个主机名。我尝试了第一位,返回了:new_data={'vmName':asset['hostnames'[0]},索引器:列表索引超出范围,第二个代码段仍然有方括号和不正确的格式出于某种原因我尝试了第一位,并返回:new_data={'vmName':asset['hostnames'][0]},索引器:列表索引超出范围,第二个代码段仍然有方括号和不正确的格式