Как я могу получить раздел «значение» из json с помощью Python?

Итак, мне нужно получить раздел «значение» из json, который должен выглядеть примерно так:

{
    "id": "<profile identifier>",
    "name": "<player name>",
    "properties": [ 
        {
            "name": "textures",
            "value": "<base64 string>",
            "signature": "<base64 string; signed data using Yggdrasil's private key>" // Only provided if ?unsigned=false is appended to url
        }
    ],
    "profileActions": []
}

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

skin_url = "https://sessionserver.mojang.com/session/minecraft/profile/" + data['id'] + "?unsigned=false"
skin_r = requests.get(skin_url)
skin_data = json.loads(skin_r.text)
print(skin_data["properties"]["value"])

У кого-нибудь есть идеи?

Вот подробности ошибки, которую я получил:

Traceback (most recent call last):
  File "C:\Users\myname\Python\numbers.py", line 15, in <module>
    print(skin_data["properties"]["value"])
          ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
TypeError: list indices must be integers or slices, not str
properties — это array, поэтому вам необходимо указать индекс. Попробуйте skin_data["properties"][0]["value"]
Benevos 19.02.2024 07:50

@Benevos Значение, связанное с ключом «свойства», представляет собой список, а не массив.

SIGHUP 19.02.2024 08:16
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Пытаться:

print(skin_data.get('свойства')[0].get('значение'))

Это потерпит неудачу, если ключ «свойства» отсутствует.

SIGHUP 19.02.2024 08:18
Ответ принят как подходящий

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

skin_url = "https://sessionserver.mojang.com/session/minecraft/profile/" + data['id'] + "?unsigned=false"
skin_r = requests.get(skin_url)
skin_data = json.loads(skin_r.text)

# Check if "properties" is not empty
if skin_data.get("properties"):
    # Iterate through the list of properties
    for prop in skin_data["properties"]:
        if prop.get("name") == "textures" and prop.get("value"):
            skin_value = prop["value"]
            print(skin_value)
else:
    print("No properties found in the JSON.")

Если ключ «свойства» существует, ожидается, что его значение будет списком. Вам нужно будет перебрать этот список.

Всегда проверяйте статус после любого вызова метода HTTP (в данном случае GET).

Изолируйте свои параметры от URL-адреса.

Объект Requests.models.Response имеет удобную функцию json().

Поэтому:

import requests

data = {
    "id": "your id goes here"
}

url = "https://sessionserver.mojang.com/session/minecraft/profile/" + data["id"]
params = {
    "unsigned": "false"
}

with requests.get(url, params=params) as response:
    response.raise_for_status()
    skin_data = response.json()
    for p in skin_data.get("properties", []):
        print(p.get("value"))

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