Ошибка типа индексирования JSON: индексы строк должны быть целыми числами

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