В Python Как получить конкретные поля из ответа Json? - PullRequest
0 голосов
/ 04 ноября 2019

Привет всем, вот мой ответ Json:

{
  "assets": [
    {
      "id": 518447,
      "created_at": "2019-09-10T10:13:38Z",
      "priority": 10,
      "operating_system": "Microsoft - Windows - Windows Server 2008 R2, Enterprise Edition - SP1",
      "notes": null,
      "last_booted_at": null,
      "primary_locator": "external_id",
      "locator": "1112359",
      "vulnerabilities_count": 22,
      "status": "active",
      "last_seen_time": "2019-09-08T16:00:17Z",
      "network_ports": [
        {
          "id": 33550493,
          "port_number": 180,
          "extra_info": "",
          "hostname": null,
          "name": "HTTP",
          "ostype": "",
          "product": "JBoss EAP",
          "protocol": "tcp",
          "state": "open",
          "version": "4.2.3.GA"
        },
        {
          "id": 33550494,
          "port_number": 100,
          "extra_info": "",
          "hostname": null,
          "name": "SNMP",
          "ostype": "",
          "product": null,
          "protocol": "udp",
          "state": "open",
          "version": null
        },

      ],
      "tags": [
        "Windows Server",
        "DO - DO SPG BOM"
      ],
      "owner": null,
      "urls": {
        "vulnerabilities": ""
      },
      "ip_address": "10.10.10.1",
      "database": null,
      "hostname": null,
      "fqdn": null,
      "netbios": null,
      "application": null,
      "file": null,
      "mac_address": null,
      "ec2": null,
      "url": null,
      "external_id": "1112359",
      "ipv6": null,
      "asset_groups": [
        {
          "id": 4,
          "name": "0 Global - All"
        },
        {
          "id": 204,
          "name": "DO - All"
        },
        {
          "id": 417,
          "name": "Do - All"
        }
      ]
    },

Что я хочу сделать, это получить определенные поля, такие как теги, операционная система и т. Д., Но я не знаю, какую логику я долженреализовать в этом случае вишню, какую часть информации я хочу собрать.

вот что я сделал до сих пор

import requests
import  gzip
import json

url = 'https://api.thisismyurl.com/assets/'
token = 'Blahblahblah'
# 'Content-Type': 'application/json'
headers = {'X-Risk-Token': token, 'Accept': 'application/json'}
response = requests.get(url,headers=headers)
print(response.status_code)
json_format = json.loads(response.text)

здесь я не знаю, как обязательно двигаться вперед вэтот случай.

Есть идеи?

1 Ответ

0 голосов
/ 04 ноября 2019

Во-первых, ваш json недействителен, в нем отсутствуют закрывающие скобки. это работает:

{
"assets": [{
            "id": 518447,
            "created_at": "2019-09-10T10:13:38Z",
            "priority": 10,
            "operating_system": "Microsoft - Windows - Windows Server 2008 R2, Enterprise Edition - SP1",
            "notes": null,
            "last_booted_at": null,
            "primary_locator": "external_id",
            "locator": "1112359",
            "vulnerabilities_count": 22,
            "status": "active",
            "last_seen_time": "2019-09-08T16:00:17Z",
            "network_ports": [{
                    "id": 33550493,
                    "port_number": 180,
                    "extra_info": "",
                    "hostname": null,
                    "name": "HTTP",
                    "ostype": "",
                    "product": "JBoss EAP",
                    "protocol": "tcp",
                    "state": "open",
                    "version": "4.2.3.GA"
                },
                {
                    "id": 33550494,
                    "port_number": 100,
                    "extra_info": "",
                    "hostname": null,
                    "name": "SNMP",
                    "ostype": "",
                    "product": null,
                    "protocol": "udp",
                    "state": "open",
                    "version": null
                }
            ],
            "tags": [
                "Windows Server",
                "DO - DO SPG BOM"
            ],
            "owner": null,
            "urls": {
                "vulnerabilities": ""
            },
            "ip_address": "10.10.10.1",
            "database": null,
            "hostname": null,
            "fqdn": null,
            "netbios": null,
            "application": null,
            "file": null,
            "mac_address": null,
            "ec2": null,
            "url": null,
            "external_id": "1112359",
            "ipv6": null,
            "asset_groups": [{
                    "id": 4,
                    "name": "0 Global - All"
                },
                {
                    "id": 204,
                    "name": "DO - All"
                },
                {
                    "id": 417,
                    "name": "Do - All"
                }
        ]
    }]
}

как только вы создали переменную с помощью json, вы можете получить доступ к данным следующим образом:

print(json_format['assets'])

Это вернет все объекты в ['assets']:

[{'id': 518447, 'created_at': '2019-09-10T10:13:38Z', 'priority': 10, 'operating_system': 'Microsoft - Windows - Windows Server 2008 R2, Enterprise Edition - SP1', 'notes': None, 'last_booted_at': None, 'primary_locator': 'external_id', 'locator': '1112359', 'vulnerabilities_count': 22, 'status': 'active', 'last_seen_time': '2019-09-08T16:00:17Z', 'network_ports': [{'id': 33550493, 'port_number': 180, 'extra_info': '', 'hostname': None, 'name': 'HTTP', 'ostype': '', 'product': 'JBoss EAP', 'protocol': 'tcp', 'state': 'open', 'version': '4.2.3.GA'}, {'id': 33550494, 'port_number': 100, 'extra_info': '', 'hostname': None, 'name': 'SNMP', 'ostype': '', 'product': None, 'protocol': 'udp', 'state': 'open', 'version': None}], 'tags': ['Windows Server', 'DO - DO SPG BOM'], 'owner': None, 'urls': {'vulnerabilities': ''}, 'ip_address': '10.10.10.1', 'database': None, 'hostname': None, 'fqdn': None, 'netbios': None, 'application': None, 'file': None, 'mac_address': None, 'ec2': None, 'url': None, 'external_id': '1112359', 'ipv6': None, 'asset_groups': [{'id': 4, 'name': '0 Global - All'}, {'id': 204, 'name': 'DO - All'}, {'id': 417, 'name': 'Do - All'}]}]

Вы можете выбрать следующий объект, добавив его непосредственно после объекта ['assets']:

print(json_format['assets'][0]['ip_address'])

возвращает:

10.10.10.1

И этопродолжается и продолжается:

print(json_format['assets'][0]['network_ports'][0]['version'])

возвращает

4.2.3.GA

[0] используется так, как мы хотим получить данные от первого вхождения объекта ['assets'] и первого вхожденияиз сетевых портов. [1] будет вторым объектом с таким названием.

...