在python的嵌套json字典中查找一个值
Posted
技术标签:
【中文标题】在python的嵌套json字典中查找一个值【英文标题】:Find a value within nested json dictionary in python 【发布时间】:2012-12-23 01:09:29 【问题描述】:从下面的 json 中,在 python 中,我想提取值“TEXT”。除了未知之外,所有的键都是不变的。 Unknown 可以是任何字符串,例如“a6784t66”或“hobvp*nfe”。 unknown 的值是未知的,只是它会在每个 json 响应中的那个位置。
"A":
"B":
"unknown":
"1": "F",
"maindata": [
"Info": "TEXT"
]
一行json
'"A":"B":"unknown":"1":"F","maindata":["Info":"TEXT"]'
您如何获得“文本”的值? (我知道如何使用 json.loads 加载 json)..但我不确定如何获取“Text”的值。谢谢。
(我不确定最好的标题是什么。)
【问题讨论】:
【参考方案1】:它有点长,但在上面的例子中:
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]
访问的单项列表,然后您可以按上述方式进行操作。请注意,这取决于该词典中只有一个项目 - 如果有更多项目,您需要稍微调整一下。
【讨论】:
我不知道 unknown 的值是什么......所以这行不通。 Unknown 可以是任何字符串。 所以你只需要访问当时的任何东西,不管名字是什么? 是的,这就是为什么它叫unknown=P,否则很容易得到。【参考方案2】:您可以使用递归函数来挖掘每一层并使用缩进打印其值
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)
【讨论】:
这不是公认的答案吗? OP没有指定位置是固定的。【参考方案3】:正如你所说,未知在一个固定的地方 您可以执行以下操作
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
这应该可以完成这项工作,因为只有未知密钥才是真正的“未知”
【讨论】:
我现在意识到 RocketDonkey 在他的帖子后面提到了这一点! :) @RocketDonkey - 这确实是新用户所需要的! :D以上是关于在python的嵌套json字典中查找一个值的主要内容,如果未能解决你的问题,请参考以下文章