#python #json #django
#python #json #django
Вопрос:
Я индексирую из ответа API JSON, который выглядит следующим образом:
[{
"id": 1
"name": "Gimbal HQ",
"addressLineOne": "5775 Morehouse Drive, San Diego CA 92121",
"geoFenceCircle": {
"radius": 100,
"visibility": "ORGANIZATION",
"location": {
"latitude": 32.89494374592149,
"longitude": -117.19603832579497
}
},
"placeAttributes": {
"key1": "value1",
"key2": "value2"
}
},
{
"id": 3291
"name": "Gimbal Ramp;D",
"addressLineOne": "5665 Morehouse Drive, San Diego CA 92121",
"geoFencePolygon": {
"visibility": "ORGANIZATION",
"locations": [
{
"latitude": 32.8953153522896,
"longitude": -117.19559844351653
},
{
"latitude": 32.8954009341414,
"longitude": -117.19516929007415
},
{
"latitude": 32.89564867061472,
"longitude": -117.1949815354431
},
{
"latitude": 32.89545949009762,
"longitude": -117.19463284827117
},
{
"latitude": 32.894986537037255,
"longitude": -117.19496544218902
},
{
"latitude": 32.894864920127866,
"longitude": -117.19554479933623
}
]
},
"placeAttributes": {
"key1": "value1",
"key2": "value2"
}
}]
Все в порядке и отлично. Но моя проблема связана с моим кодом, в частности с этой строкой:
for geofence in geofences:
obj, created = Geofence.objects.get_or_create(name=geofence['name'])
Кажется, я вызываю следующую ошибку:
21:17:17 web.1 | obj, created = Geofence.objects.get_or_create(name=geofence['name'])
21:17:17 web.1 | TypeError: string indices must be integers
Я не могу понять, в чем проблема, может кто-нибудь пролить свет на это?
Комментарии:
1. Похоже,
geofences
это не то, что вы думаете. Ошибка предполагает, что вы попали в строку, а не в ожидаемый словарь.2. Просто дважды проверьте в терминале, и geofences на самом деле является измененной (другой информацией, а не форматом) версией JSON. Итак, геозоны — это то, что я думаю. Если я чего-то не упустил..
3. если
geofences
это список словарей, то вы не должны видетьTypeError: string indices must be integers
.4. Вы должны показать код, который получает геозоны. Вы где-нибудь разбираете его из строки?
5. здравствуйте, пожалуйста, опишите свой вопрос более подробно или, если вы получили ответ, пожалуйста, обновите его.
Ответ №1:
Лучше проверить тип данных объекта геозоны.
Похоже, что это массив, а не карта.
Комментарии:
1. Да, я индексирую, как будто это список, как это неправильно?
Ответ №2:
я думаю, вам нужно поместить индекс перед индексом имени. попробуйте:
obj, created = Geofence.objects.get_or_create(name=geofence[0]['name'])
Ответ №3:
Ваши строковые данные формата JSON повреждены ( ,
пропущены дважды после каждого id
ключа):
[{
"id" : 1
"name" : "Gimbal HQ",
"addressLineOne" : "5775 Morehouse Drive, San Diego CA 92121"
}]
Ответ №4:
Я думаю, вы обращаетесь к dict в список.
for geofence in geofences:
obj, created = Geofence.objects.get_or_create(name=geofence[geofence].get('name'))
здесь ['geofence']
имеется в виду индекс цикла for, который выберет объект list, а для доступа к объекту dict вы можете написать get()
метод на python. Основным преимуществом этого является то, что он всегда будет возвращаться.