次の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をロードする方法は知っています)。しかし、「テキスト」の値を取得する方法がわかりません。ありがとう。
(最高のタイトルが何であるかわかりません。)
少し長めですが、上記の例では:
_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つだけであることに依存していることに注意してください。それ以上ある場合は少し調整する必要があります。
再帰関数を使用してすべてのレイヤーを掘り下げ、その値をインデントで印刷できます
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)
未知の場所は決まった場所にあるとおっしゃっていましたが、次のことができます
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
未知のキーだけが本当に「不明」なので、これでうまくいくはずです