在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字典中查找一个值的主要内容,如果未能解决你的问题,请参考以下文章

python无限遍历,实现在多维嵌套字典列表元组的JSON中获取数据

试图在嵌套字典中查找唯一值的总和。 (见例子!)

在字典中递归查找键

搜索特定值的嵌套字典列表[重复]

在 Python 中展平嵌套的 JSON API 字典

使用 Python 使用嵌套字典填充 MongoDB 数据库