Python3 — Разбор списка строк внутри вложенного json

#python #json #list #python-3.7

#python #json #Список #python-3.7

Вопрос:

Новичок в Python здесь. Я видел много похожих вопросов, но ни один из них не является моим точным вариантом использования. У меня есть простой вложенный json, и я пытаюсь получить доступ к элементу, name присутствующему внутри metadata . Ниже приведен мой пример json.

 {
    "items": [{
            "metadata": {
                "name": "myname1"
            }
        },
        {
            "metadata": {
                "name": "myname1"
            }
        }
    ]
}
  

Ниже приведен код, который я пробовал до сих пор, но безуспешно.

 import json
f = open('./myfile.json')
x = f.read()
data = json.loads(x)
for i in data['items']:
    for j in i['metadata']:
            print (j['name'])

  

Выдает ошибку, указывающую ниже

Файл «pythonjson.py «, строка 8, печатается (j[‘name’]) Ошибка типа: индексы строк должны быть целыми числами

Когда я напечатал print (type(j)) , я получил следующее o / p <class 'str'> . Итак, я вижу, что это список строк, а не словарь. Итак, теперь, как я могу проанализировать список строк? Любая официальная документация или руководство были бы очень полезны, чтобы узнать концепцию этого.

Комментарии:

1. Попробуйте также преобразовать вложенный элемент в json -> print(json.loads(j)['name']

2. JSON Предоставленное недопустимо. Также вам, вероятно, понадобится print(item['metadata']['name']) в первом цикле for. Второй цикл не требуется.

3. ваш json недопустим

4. : Помимо отсутствия, вложенный JSON был бы чем-то вроде {"foo": "{"bar": 5}"} , где значение foo ключа само может быть декодировано. У вас есть просто «обычный» объект JSON, который при декодировании создает вложенную структуру данных на любом языке, который вы использовали для его декодирования.

5. Извините за публикацию недопустимого Json. Сейчас это исправлено.

Ответ №1:

Ваш json неисправен, а исключение python ясно и недвусмысленно. У вас есть базовая строка «name», и вы пытаетесь … выполните поиск по этому?

Давайте вырежем весь json и посмотрим на реальную проблему. Вы не знаете, как выполнить итерацию по dict. На самом деле вы перебираете сами ключи. Если вы хотите также увидеть их значения, вам понадобится dict.items()

https://docs.python.org/3/tutorial/datastructures.html#looping-techniques

 metadata = {"name": "myname1"}
for key, value in metadata.items():
    if key == "name":
        print ('the name is', value)
  

Но зачем беспокоиться, если вы уже знаете ключ, который хотите найти?
Буквально для этого у нас есть dict.

 print ('the name is', metadata["name"])
  

Комментарии:

1. Раньше я выполнял итерации по объектам dict, как я делал в своем вопросе для boto3 (AWS Python SDK), и я также мог получить доступ к значениям без каких-либо сбоев. Итак, я думал, что все делаю правильно, но ваш ответ имеет больше смысла. Придется заново ознакомиться с основами python. Извините за json. Теперь исправлено.

2. Если вы используете этот код, вы просто перебираете ключи. Но это не меняет того факта, что вы можете использовать эти ключи для поиска их значений, так что вот так.

3. Поправьте меня, если я ошибаюсь, из этого я извлек один урок. Всякий раз, когда я прихожу к объекту string внутри dict, тогда пришло время прекратить итерацию, и я могу напрямую вызвать их. Верно?

4. Если вы уже знаете, какой ключ вы ищете, то не выполняйте итерацию, чтобы найти его. Просто используйте его напрямую. (если вы беспокоитесь о том, что его там нет, проверьте или обработайте это, не повторяйте)

5. но да, вы «можете» выполнить итерацию, чтобы найти это. Но это неэффективно, потенциально вредно — вы узнаете нотацию big-O позже.

Ответ №2:

Вероятно, вам понадобится:

 import json
f = open('./myfile.json')
x = f.read()
data = json.loads(x)
for item in data['items']:
    print(item["metadata"]["name"]
  

Ваш оригинал JSON недействителен (отсутствуют двоеточия).

Комментарии:

1. Извините, Json сейчас исправлен. Переходя к решению, поэтому, когда мы нажимаем на строки внутри json (или словаря), мы не должны повторять дальше, верно? Мы должны обращаться к ним напрямую? Правильно ли я понимаю?

Ответ №3:

для доступа к содержимому имени используйте «i[«метаданные»].keys()» это вернет все ключи в «метаданных».

Рабочий код для доступа ко всем значениям словаря в «метаданных».

 for i in data['items']:
    for j in i["metadata"].keys():
        print (i["metadata"][j])
  

** обновление: ** Рабочий код для доступа только к содержимому «name».

 for i in data['items']:
        print (i["metadata"]["name"])
  

Комментарии:

1. Хороший способ! это решит этот вопрос. но не будет выдавать ожидаемый результат, когда внутри есть несколько ключей metadata . Я думаю, его нужно немного подправить.