【问题标题】:Find a value within nested json dictionary in python在python的嵌套json字典中查找一个值
【发布时间】: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”的值。谢谢。

(我不确定最好的标题是什么。)

【问题讨论】:

    标签: python dictionary python-2.7 nested


    【解决方案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
    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2013-07-01
    • 2018-05-31
    • 1970-01-01
    • 2022-10-12
    • 2013-10-23
    • 2013-09-20
    • 2022-07-05
    相关资源
    最近更新 更多