当使用Python未知密钥时,如何解析Json?

时间:2019-01-22 10:19:42

标签: python json

这是我的Json的示例:

text = {"rates":{
   "AT":{
     "country_name":"Austria",
     "standard_rate":20,
     "reduced_rates":{
       "food":10,
       "books":10
     }
  }
}}

现在“ AT”是国家/地区代码。.它不是固定的。也可以是GB,IT等...

我想解析此Json并从中获取列,如下所示:

rates.AT   rates.AT.country_name   rates.AT.reducted_rates.food
  AT           Austria                  10

也可以重命名为:

code        country_name               food
  AT           Austria                  10

例如,在另一个运行中,我有:

text = {"rates":{
   "IT":{
     "country_name":"Italy",
     "standard_rate":20,
     "reduced_rates":{
       "food":13,
       "books":11
     }
  }
}}

然后它必须是:

rates.IT   rates.IT.country_name   rates.IT.reducted_rates.food
  IT           Italy                     13

也可以重命名为:

 code        country_name               food
  IT           Italy                     13

我该怎么做?

编辑:

如果可能的话,使用@GPhilo答案,我希望将数据作为Pandas数据框获取。 就像是?

df = pd.DataFrame()
for k,item in dic['rates'].items(): # use iteritems() if you're on Python 2
    line = '{};{};{}'.format(k, item['country_name'], item['reduced_rates']['food'])
    df = df.append(line, ignore_index=True)

这行不通,因为行不是执行此操作的正确方法。

2 个答案:

答案 0 :(得分:2)

一旦解析,json个对象就是python dict,因此只需按所需级别遍历键/值对并打印信息即可:

import json

dic = json.loads('''
{"rates":{
   "AT":{
     "country_name":"Austria",
     "standard_rate":20,
     "reduced_rates":{
       "food":10,
       "books":10
     }
  }
}}
''')

for k,item in dic['rates'].items(): # use iteritems() if you're on Python 2
    print('{};{};{}'.format(k, item['country_name'], item['reduced_rates']['food']))

根据需要格式化输出,您需要的三个值是上面代码中format调用中的三个。 运行示例返回:

AT;Austria;10

编辑:修改了答案

解析后,json对象 python字典:print(dic.__class__)返回<class 'dict'>

更新

要回答问题中的修改,只需附加值即可,而不是附加格式化的字符串:

df = pd.Dataframe(columns=['code', 'country_name', 'food'])
[...]
df = df.append([k, item['country_name'], item['reduced_rates']['food']], ignore_index=True)

答案 1 :(得分:1)

您应该使用dict.keys()来获取字典中所有键的列表,然后可以对其进行迭代并执行所需的任何操作。 例如:

for k in text.keys():
   #do something with text[k] or k itself

还考虑使用dict.items()来获取密钥对,值:

for k, v in text.items():
    #do something with k and v, where text[k] is v

这对python 3很有好处,在python 2中,您应该使用dict.iteritems()