Есть ли способ получить доступ к n-му элементу JSON с помощью Python?

У меня есть этот 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"]

Это напечатает ключевую ошибку.

В зависимости от вашей версии Python dict может быть неупорядоченным, поэтому «второй» элемент на самом деле не имеет значения.

a_guest 08.04.2019 02:16
mediaById это не массив, это объект/словарь. Вы, вероятно, не должны полагаться на то, что порядок всегда будет одинаковым.
Mark 08.04.2019 02:17

Я понимаю, что приведенный выше код не будет работать, потому что JSON не является списком и неупорядочен. Мне просто нужен аналогичный способ доступа к n-му элементу в зависимости от порядка, предполагающего, что он не изменится.

Samy 08.04.2019 02:22

Вам нужно зациклить пары ключ-значение внутри json_content['products']["5117293"]["mediaById"] и проверить, содержит ли значение, соответствующее полю src, строку image2. Индексация не работает для диктов вообще.

FatihAkici 08.04.2019 02:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
2 812
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Мне удалось сделать это, используя временный список для получения идентификаторов мультимедиа и доступа ко второму элементу этого списка.

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

Samy 08.04.2019 03:44
Ответ принят как подходящий

Вы можете сделать это следующим образом:

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

Другие вопросы по теме