Найти значение во вложенном словаре 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)