@Razer1511

Как распаковывать сложные json ответы через python?

Добрый день. Подскажите пожалуйста, как пройтись циклом for по сложному json ответу, состоящим из нескольких блоков.

Пример json ответа:
data =
[{"LocationId":1,"BlastHole":[{"Coords":{"X":15599.1298828125,"Y":35847.578125,"Z":180.10580444335938},"DesignMass":835.0,"AdditionalCharge":0.0,"RealAdditionalMass":0.0,"DesignHeight":9.992707,"RealMass":1301.0,"DesignExplosiveId":8,"RealHeight":15.56948,"RealExplosiveId":8,"Depth":10.0,"SourceHoleDepth":17.10579,"Tamping":0.0,"StatusId":4,"UnitId":4062,"StaffId":1019,"SecondStaffId":-1,"ShiftId":1,"Diameter":0.311,"StartTimestamp":"2020-08-18T08:46:39","EndTimeStamp":"2020-08-18T08:47:16","HoleNotes":null,"HoseLength":0.0,"BlockID":14999,"ID":717689,"Name":"100","OldName":null} . . . {} . . . {} . . . {}]


Нужно узнать значение переменной из верхнего json ответа или хотя бы номер строки, в которой находится условие цикла
Мой вариант кода:

for i in data:
    if i['BlastHole']['Name'] == '100':
        print(['BlastHole']['SecondStaffId'])


Ошибка:

TypeError: list indices must be integers or slices, not str

P.S. Я знаю, что в данном варианте сработает через i['BlastHole'][0]['Name'], но таких строчек может быть 300+, и мне нужно узнавать именно значение переменной.
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bbkmzzzz
spoiler

data = [
    {
        "LocationId": 1, "BlastHole":
        [
            {
                "Coords":
                    {
                        "X": 15599.1298828125, "Y": 35847.578125, "Z": 180.10580444335938
                    },
                "DesignMass": 835.0,
                "AdditionalCharge": 0.0,
                "RealAdditionalMass": 0.0,
                "DesignHeight": 9.992707,
                "RealMass": 1301.0,
                "DesignExplosiveId": 8,
                "RealHeight": 15.56948,
                "RealExplosiveId": 8,
                "Depth": 10.0,
                "SourceHoleDepth": 17.10579,
                "Tamping": 0.0,
                "StatusId": 4,
                "UnitId": 4062,
                "StaffId": 1019,
                "SecondStaffId": -1,
                "ShiftId": 1,
                "Diameter": 0.311,
                "StartTimestamp": "2020-08-18T08:46:39",
                "EndTimeStamp": "2020-08-18T08:47:16",
                "HoleNotes": "null",
                "HoseLength": 0.0,
                "BlockID": 14999,
                "ID": 717689,
                "Name": "100",
                "OldName": "null"
            }
        ]
    }
]


+ 1 принт, и сразу понятнее
for i in data:
    print('BlastHole', i['BlastHole'])
    if i['BlastHole']['Name'] == '100':
        print(['BlastHole']['SecondStaffId'])

У элемента списка числовой индекс, никаких ключей, так что вариант доступа i['BlastHole'][0]['Name'] единственный. Каких строк может быть много? Пройтись еще одним циклом по списку?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы