web-dev-qa-db-ja.com

pythonでネストされたjson辞書内の値を見つけます

次のjsonから、pythonで、値「TEXT」を抽出したいと思います。未知のものを除いて、すべてのキーは一定です。不明は、「a6784t66」や「hobvp * nfe」などの任意の文字列です。 nknownの値は不明、各json応答でその位置にあることだけ。

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

1行のjson

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

「テキスト」の値をどのように取得しますか? (json.loadsでjsonをロードする方法は知っています)。しかし、「テキスト」の値を取得する方法がわかりません。ありがとう。

(最高のタイトルが何であるかわかりません。)

11
user1959942

少し長めですが、上記の例では:

_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]_を使用してアクセスできる単一アイテムのリストで、上記のように続行できます。これは、そのディクショナリに存在するアイテムが1つだけであることに依存していることに注意してください。それ以上ある場合は少し調整する必要があります。

18
RocketDonkey

再帰関数を使用してすべてのレイヤーを掘り下げ、その値をインデントで印刷できます

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)
2
nagordon

未知の場所は決まった場所にあるとおっしゃっていましたが、次のことができます

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

未知のキーだけが本当に「不明」なので、これでうまくいくはずです

2
minocha