2016-04-07 10 views
-1

私はnameを以下のJSONから引き抜こうとしています。私が抱えている問題は、JSONのホスト名が動的なので、意味がある場合は、そのレイヤーの下をどのように掘るのかわかりません。したがって、 'ip-10-12-68-170.b2c.test.com'にはjsonの各ブロックごとに異なるipがあります。動的キー名でPythonでjsonを解析するには?

{ 
    "host" : { 
     "ip-10-12-68-170.b2c.test.com" : { 
      "environment" : { 
       "testing1" : { 
        "ip" : "ip-10-12-68-170", 
        "name" : "testing", 
        "env.root" : "/", 
        "host" : "ip-10-12-68-170.b2c.test.com", 
        "sin" : "sin.80", 
        "env.description" : "Content Author Preview" 
       } 
      } 
     }, 
     "ip-10-12-108.27.b2c.test.com" : { 
      "environment" : { 
        "esbqav" : { 
        "ip" : "ip-10-12-108.27", 
        "name" : "espv", 
        "env.root" : "/", 
        "host" : "ip-10-12-108.27.b2c.test.com", 
        "sin" : "sin.0", 
        "env.description" : "QA" 
       } 
      } 
     } 
    } 
} 

この例では、どのようにしてnameを取得しますか。

+0

あなたの質問のコードサンプルは、JSON文字列かPythonプログラムの断片であることを意図していますか? –

答えて

0

.items()メンバーに電話すると、dictを反復処理できます。そうすれば、キーが何であるかを事前に知る必要はありません。

json= { 
    "host" : { 
     "ip-10-12-68-170.b2c.test.com" : { 
     "environment" : { 
      "testing1" : { 
       "ip" : "ip-10-12-68-170", 
       "name" : "testing", 
       "env.root" : "/", 
       "host" : "ip-10-12-68-170.b2c.test.com", 
       "sin" : "sin.80", 
       "env.description" : "Content Author Preview" 
      } 
     } 
     }, 
     "ip-10-12-108.27.b2c.test.com" : { 
     "environment" : { 
      "esbqav" : { 
       "ip" : "ip-10-12-108.27", 
       "name" : "espv", 
       "env.root" : "/", 
       "host" : "ip-10-12-108.27.b2c.test.com", 
       "sin" : "sin.0", 
       "env.description" : "QA" 
      } 
     } 
     } 
    } 
} 
for ip, ip_dict in json['host'].items(): 
    for hostname, hostname_dict in ip_dict['environment'].items(): 
     name = hostname_dict['name'] 
     print (ip, hostname, name) 

次のコードは同等であるが、単にキーを反復処理としないキーと値のペア:

for ip in json['host']: 
    for hostname in json['host'][ip]['environment']: 
     name = json['host'][ip]['environment'][hostname]['name'] 
     print (ip, hostname, name) 
1

それは構造が通りであることを考えると、辞書values()又はitems()方法を使用して可能ですこの例では、

import json 

json_string = """ 
{ 
    "host" : { 
     "ip-10-12-68-170.b2c.test.com" : { 
     "environment" : { 
      "testing1" : { 
       "ip" : "ip-10-12-68-170", 
       "name" : "testing", 
       "env.root" : "/", 
       "host" : "ip-10-12-68-170.b2c.test.com", 
       "sin" : "sin.80", 
       "env.description" : "Content Author Preview" 
      } 
     } 
     }, 
    "ip-10-12-108.27.b2c.test.com" : { 
     "environment" : { 
      "esbqav" : { 
      "ip" : "ip-10-12-108.27", 
      "name" : "espv", 
      "env.root" : "/", 
      "host" : "ip-10-12-108.27.b2c.test.com", 
      "sin" : "sin.0", 
      "env.description" : "QA" 
      } 
     } 
    } 
    } 
} 
""" 

json_data = json.loads(json_string) 

for host in json_data.values(): 
    for hostname in host.values(): 
     environment = hostname.get('environment') 

     for env in environment.values(): 
      name = env.get('name') 
      print name 
関連する問題