#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 привела к неудачным нескольким моим другим попыткам, я бы никогда не подумал это изменить. Еще раз спасибо, высоко ценится!