У меня есть этот JSON, например:
"products": {
"5117293": {
"id": 5117293,
"brandId": 12,
"price": "12$"
"mediaById": {
"104290597": {
"id": "17_104290597",
"group": "swatch",
"type": "image",
"src": "https://foo.com/image1.jpg"
},
"104725944": {
"id": "7_104725947",
"group": "main",
"type": "image",
"src": "https://foo.com/image2.jpg"
}
},
}
Допустим, я хочу получить доступ ко второму изображению изображение2.jpg. Как мне это сделать с библиотекой Python JSON, не зная идентификатора? (доступ ко второму элементу в этом примере). Вот что я пробовал и, очевидно, потерпел неудачу (Обновлено: я понимаю, что это не сработает, я просто хочу сделать то же самое).
image = json_content['products']["5117293"]["mediaById"][1]["src"]
Это напечатает ключевую ошибку.
mediaById
это не массив, это объект/словарь. Вы, вероятно, не должны полагаться на то, что порядок всегда будет одинаковым.
Я понимаю, что приведенный выше код не будет работать, потому что JSON не является списком и неупорядочен. Мне просто нужен аналогичный способ доступа к n-му элементу в зависимости от порядка, предполагающего, что он не изменится.
Вам нужно зациклить пары ключ-значение внутри json_content['products']["5117293"]["mediaById"]
и проверить, содержит ли значение, соответствующее полю src
, строку image2
. Индексация не работает для диктов вообще.
Мне удалось сделать это, используя временный список для получения идентификаторов мультимедиа и доступа ко второму элементу этого списка.
images = json_content['products']["5117293"]['mediaById']
imagesList = []
for imageID in images:
imagesList.append(imageID)
image = prod['mediaById'][imagesList[1]]['src']
Чтобы получить «второй» индекс на основе того, как падает порядок, вы можете использовать:
nth = 2
nth_image_id = json_content['products']["5117293"]["mediaById"].keys()[nth - 1]
image = json_content['products']["5117293"]["mediaById"][nth_image_id]["src"]
Как отмечали другие в комментариях, порядок может быть определен нечетко. Однако в этом случае, если вы знаете, что номер идентификатора всегда будет увеличиваться, вы можете использовать его для получения n-го элемента в другом смысле «n-го», который хорошо определен.
nth = 2
# determine the nth id
image_ids = json_content['products']["5117293"]["mediaById"].keys()
image_ids = [int(x) for x in image_ids]
image_ids.sort()
nth_image_id = image_ids[nth - 1]
# pull the nth image
image = json_content['products']["5117293"]["mediaById"][nth_image_id]["src"]
Что ж, это определенно сработает, если ID увеличивается, но здесь это не так. Однако ваш ответ имеет смысл в другом контексте.
Вы можете сделать это следующим образом:
import json
j = """
{
"products": {
"5117293": {
"id": 5117293,
"brandId": 12,
"price": "12$",
"mediaById": {
"104290597": {
"id": "17_104290597",
"group": "swatch",
"type": "image",
"src": "https://foo.com/image1.jpg"
},
"104725944": {
"id": "7_104725947",
"group": "main",
"type": "image",
"src": "https://foo.com/image2.jpg"
}
}
}
}
}
"""
d = json.loads(j)
print(list(d['products']['5117293']['mediaById'].items())[1][1]['src']) #for the second item
>>> https://foo.com/image2.jpg
#print(list(d['products']['5117293']['mediaById'].items())[0][1]['src']) #for the first item
В зависимости от вашей версии Python
dict
может быть неупорядоченным, поэтому «второй» элемент на самом деле не имеет значения.