Найти значение во вложенном словаре json в python

из следующего json, в python, я хотел бы извлечь значение "текст". Все ключи постоянны, кроме unknown. Неизвестной может быть любая строка, такая как" a6784t66 "или"hobvp*nfe". значение неизвестно, неизвестно,, только то, что он будет в этой позиции в каждом ответе json.

{
  "A": {
    "B": {
      "unknown": {
        "1": "F",
        "maindata": [
          {
            "Info": "TEXT"
          }
        ]
      }
    }
  }
}

одна строка json

'{"A":{"B":{"unknown":{"1":"F","maindata":[{"Info":"TEXT"}]}}}}'

Как бы вы получили значение "текст"? (Я знаю, как загрузить json с json.нагрузки.).но я не уверен, как получить значение "Текст." Спасибо.

(Я не уверен, что лучший заголовок.)

3 ответов


это немного длинновато, но в этом примере выше:

In [1]: import json

In [2]: s = """\
   ...: {
   ...:   "A": {
   ...:     "B": {
   ...:       "unknown": {
   ...:         "1": "F",
   ...:         "maindata": [
   ...:           {
   ...:             "Info": "TEXT"
   ...:           }
   ...:         ]
   ...:       }
   ...:     }
   ...:   }
   ...: }"""

In [3]: data = json.loads(s)

In [4]: data['A']['B']['unknown']['maindata'][0]['Info']
Out[4]: u'TEXT'

вы в основном рассматриваете его как словарь, передавая ключи, чтобы получить значения каждого вложенного словаря. Единственная другая часть, когда вы нажмете maindata, где результирующим значением является список. Чтобы справиться с этим, мы вытаскиваем первый элемент [0] и Info ключ, чтобы получить значение TEXT.

в случае unknown изменение, вы заменили бы его переменной, которая представляет "известное" имя, которое он примет в этот момент в вашем коде:

my_variable = 'some_name'
data['A']['B'][my_variable]['maindata'][0]['Info']

и если бы я действительно правильно прочитал Ваш вопрос в первый раз, если вы не знаете, что unknown в любой точке, вы можете сделать что-то вроде этого:

data['A']['B'].values()[0]['maindata'][0]['Info']

здесь values() - это переменная, содержащая:

[{u'1': u'F', u'maindata': [{u'Info': u'TEXT'}]}]

список одного элемента, который можно получить с помощью [0] и затем вы можете начать, как указано выше. Обратите внимание, что это зависит от наличия только одного элемента присутствующие в этом словаре - вам нужно было бы немного настроить, если бы их было больше.


Как вы сказали, что неизвестный находился в фиксированном месте Вы можете сделать следующее

import json
s=json.loads('{"A":{"B":{"unknown":{"1":"F","maindata":[{"Info":"TEXT"}]}}}}')
i=s["A"]["B"].keys()
x=i[0]   # Will store 'unknown' in x, whatever unknown is
print s['A']['B'][x]['maindata'][0]['Info']    #here x dictionary index is used after B as its value will be the value for unknown

Это должно сделать работу, так как только неизвестный ключ действительно "неизвестное"


вы можете использовать рекурсивную функцию, чтобы прокопать каждый слой и распечатать его значение с отступом

def recurse_keys(df, indent = '  '):
    ''' 
    import json, requests, pandas
    r = requests.post(...)  
    rj = r.json() # json decode results query
    j = json.dumps(rj, sort_keys=True,indent=2)            
    df1 = pandas.read_json(j)         
    '''
    for key in df.keys():
        print(indent+str(key))
        if isinstance(df[key], dict):
            recurse_keys(df[key], indent+'   ')
recurse_keys(df1)