Разбор Json извлечение ключевого значения python - PullRequest
0 голосов
/ 16 июня 2020

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

KeyError: 'id'

Не уверен, что я делаю что-то не так, но я обращаюсь к нему с помощью REST API: Это то, что у меня есть в виде скрипта:

from requests.auth import HTTPBasicAuth
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def countries():
    data = requests.get("https://10.24.21.4:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    for cid in rep:
        cid = rep["id"]
        print(cid)
countries()

Ответ довольно длинный, но он такой, вы увидите «id» и мне нужны соответствующие значения:

{
    "items": [
        {
            "name": "Afghanistan",
            "displayName": "Afghanistan",
            "meta": {
                "type": "COUNTRY"
            },
            "id": "AF",
            "links": {
                "self": {
                    "path": "/api/netim/v1/countries/AF"
                }
            }
        },
        {
            "name": "Albania",
            "displayName": "Albania",
            "meta": {
                "type": "COUNTRY"
            },
            "id": "AL",
            "links": {
                "self": {
                    "path": "/api/netim/v1/countries/AL"
                }
            }
        },
        {
            "name": "Algeria",
            "displayName": "Algeria",
            "meta": {
                "type": "COUNTRY"
            },
            "id": "DZ",
            "links": {
                "self": {
                    "path": "/api/netim/v1/countries/DZ"
                }
            }
        },
        {
            "name": "American Samoa",
            "displayName": "American Samoa",
            "meta": {
                "type

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Я немного переписал ваши функции, теперь вы сможете получить все идентификаторы из ответа JSON. Я предлагаю вам изучить основы словарей и списков в Python

from requests.auth import HTTPBasicAuth
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def countries():
    data = requests.get("https://10.24.21.4:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    return [elem.get("id","") for elem in rep['items']]

countries()

Обновление: если вы sh извлекаете значение ключа "path" и одновременно значение "id" "ключ, вам понадобится список словарей, где каждый словарь соответствует одной записи из json.

измененная функция выглядит следующим образом:

def countries():
    data = requests.get("https://10.24.21.4:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    return [{"id":elem.get("id",""),"path":elem["links"]["self"]["path"]} for elem in rep['items']]

the get() возвращает значение по умолчанию, если ключ отсутствует в словаре. Функция, как новая, так и предыдущая, не завершится ошибкой, если значения не были возвращены в ответе JSON для ключей id и path

Если вы уверены, что значение links всегда будет доступно, вы можете использовать указанную выше функцию напрямую, иначе вам придется написать настраиваемую функцию, которая будет анализировать ключ links и возвращать пустую строку, если она пуста в json

1 голос
/ 16 июня 2020

Ответ - это не массив, это словарь. Вам нужен элемент "items" этого словаря:

for cid in rep['items']:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...