Python 3 — Извлечение значения из ключа во вложенном словаре

#json #dictionary #nested #python-3.8

#json #словарь #вложенный #python-3.8

Вопрос:

Надеюсь на некоторые указания здесь, поскольку я продолжаю свои попытки. Я работаю с python 3.8.5.

Я запрашиваю систему бронирования парковки, которая возвращает список доступности в формате json. В результате получается множество вложенных словарей, и я изо всех сил пытаюсь извлечь только те значения, которые я хочу.

Это то, что я делал:

 import requests
import json

enquiry = requests.post(url.....) #queries api, this works fine

results = enquiry.text #extracts response data

dictionary = json.loads(results) #convert response to python dict
  

Если есть один доступный слот, я получаю этот вывод (извиняюсь за длину). Если доступно несколько слотов, я получаю повторный вывод:

 {
    "data": {
        "services": [{
            "id": null,
            "name": null,
            "services": [{
                "id": null,
                "name": "Car Park",
                "met": true,
                "filterCount": 1,
                "primary": true,
                "options": [{
                    "id": "9",
                    "images": [],
                    "available": true,
                    "calendarId": "AAAA",
                    "templateId": "BBBB",
                    "capacity": 0,
                    "name": "Car Park Slot 3",
                    "sessionId": "CCCC",
                    "functions": null,
                    "startDate": "2020-08-18T13:30:00Z", <--this is what I want to extract
                    "endDate": "2020-08-18T14:30:00Z",
                    "geo": {
                        "lat": 0.0,
                        "lng": 0.0
                    },
                    "selected": false,
                    "linkedServices": [],
                    "tiers": null
                }]
            }],
            "currentBookingId": null,
            "startDate": {
                "ms": 1597757400000,
                "year": 2020,
                "month": 8,
                "day": 18,
                "dayOfWeek": 2,
                "time": {
                    "seconds": 0,
                    "minutes": 30,
                    "hours": 14,
                    "days": 0
                }
            },
            "endDate": {
                "ms": 1597761000000,
                "year": 2020,
                "month": 8,
                "day": 18,
                "dayOfWeek": 2,
                "time": {
                    "seconds": 0,
                    "minutes": 30,
                    "hours": 15,
                    "days": 0
                }
            },
            "sessionId": "2222222",
            "chargeType": 1,
            "hasPrimaryBookable": false,
            "hasBookable": false,
            "hasDiscounts": false,
            "hasMultipleTiers": false,
            "isPreferred": false,
            "primaryServiceAvailable": true,
            "primaryServiceId": null,
            "primaryServiceType": "undefined",
            "unavailableAttendees": []
        }],
        "bookingLimit": null
    },
    "success": true,
    "suppress": false,
    "version": "2.3.293",
    "message": null,
    "result": null,
    "errors": null,
    "code": null,
    "flags": 0,
    "redirect": null
}
  

Я хочу извлечь:

 "startDate": "2020-08-18T13:30:00Z"
  

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

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

 "startDate": {
                "ms": 1597757400000,
                "year": 2020,
                "month": 8,
                "day": 18,
                "dayOfWeek": 2,
                "time": {
                    "seconds": 0,
                    "minutes": 30,
                    "hours": 14,
                    "days": 0
                }
  

Я перепробовал множество вариантов dictionary.get и dictionary.items, но, похоже, ничего не получается.

Я попробовал что-то вроде

 key = ('startDate')
availability = dictionary.get(key)
print(availability)
  

это просто возвращает ‘none’, так что, думаю, я далек

Есть какие-нибудь указатели?

Заранее спасибо!

Ответ №1:

Спасибо за полные данные. Это упрощает тестирование 🙂

Мне пришлось заменить null -> None, true -> True, false -> False

 slot = {
    "data": {
        "services": [{
            "id": None,
            "name": None,
            "services": [{
                "id": None,
                "name": "Car Park",
                "met": True,
                "filterCount": 1,
                "primary": True,
                "options": [{
                    "id": "9",
                    "images": [],
                    "available": True,
                    "calendarId": "AAAA",
                    "templateId": "BBBB",
                    "capacity": 0,
                    "name": "Car Park Slot 3",
                    "sessionId": "CCCC",
                    "functions": None,
                    "startDate": "2020-08-18T13:30:00Z", # <--this is what I want to extract
    ................
    
    
print("Start Date:", slot['data']['services'][0]['services'][0]['options'][0]['startDate'])
  

Вывод

 Start Date: 2020-08-18T13:30:00Z
  

Комментарии:

1. Потрясающе, спасибо! я думаю, что проблема с null / none привела к неудачным нескольким моим другим попыткам, я бы никогда не подумал это изменить. Еще раз спасибо, высоко ценится!