在Python中解析具有可变结构的json文件

时间:2012-05-04 19:54:53

标签: python json api parsing

我正在使用Yahoo Placemaker API,它根据输入提供不同的json结构。 简单的json文件如下所示:

{
   'document':{
        'itemDetails':{
            'id'='0'
            'prop1':'1',
            'prop2':'2'
         }
        'other':{
            'propA':'A',
            'propB':'B'
        }
    }
}

当我想访问itemDetails时,我只需编写json_file ['document'] ['itemDetails']。

但是当我得到更复杂的回应时,例如

{
   'document':{
      '1':{
         'itemDetails':{
            'id'='1'
            'prop1':'1',
            'prop2':'2'
         }
      },
      '0':{
         'itemDetails':{
            'id'='0'
            'prop1':'1',
            'prop2':'2'
         },
      '2':{
         'itemDetails':{
            'id'='1'
            'prop1':'1',
            'prop2':'2'
         }
        'other':{
            'propA':'A',
            'propB':'B'
        }
    }
}

解决方案显然不起作用。

我使用id,prop1和prop2来创建对象。

在不写json_file ['document'] ['0'] ['itemDetails']的情况下,在第二种情况下自动访问itemDetails的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望遍历所有json_file['document']['0']['itemDetails']json_file['document']['1']['itemDetails'],......

如果是这样的话,那么:

item_details = {}
for key, value in json_file['document']:
    item_details[key] = value['itemDetails']

或者,单行:

item_details = {k: v['itemDetails'] for k, v in json_file['document']}

然后,您可以item_details['0']item_details['1'],...

访问它们

注意:您可以使用int(key)int(k)来抑制0和1附近的单引号。

修改 如果您想要无缝访问这两种情况(无论是一个结果还是多个结果),您可以检查:

if 'itemDetails' in json_file['document']:
    item_details = {'0': json_file['document']['itemDetails']}
else:
    item_details = {k: v['itemDetails'] for k, v in json_file['document'] if k != 'other'}

然后循环遍历item_details词典。