输出每个属性,在不均匀的JSON对象中输出值

时间:2014-09-29 15:46:58

标签: python json

我有一个非常长且不均匀的JSON对象,我想输出对象的终点(叶子)的每个属性值。

例如,它可能如下所示:

data = {
    "Response": {
        "Version": "2.0",
        "Detail": {
            "TransactionID": "Ib410c-2",
            "Timestamp": "04:00"
        },
        "Transaction": {
            "Severity": "Info",
            "ID": "2222",
            "Text": "Success"
        },
        "Detail": {
            "InquiryDetail": {
                "Value": "804",
                "CountryISOAlpha2Code": "US"
            },
            "Product": {
                "ID": "PRD",
                "Org": {
                    "Header": {
                        "valuer": "804"
                    },
                    "Location": {
                        "Address": [
                            {
                                "CountryISOAlpha2Code": "US",
                                "Address": [
                                    {
                                        "Text": {
                                            "@Value": 2,
                                            "$": "Hill St"
                                        }
                                    }
                                ]
                            }
                        ]
                    }
                }
            }
        }
    }
}

我想输出每个潜在的叶子。它可以输出(最终属性或整个路径)和值。

我知道我只需要添加一些内容:

data = json.loads(inputFile)
small = repeat(data)
for attribute,value in small.iteritems():
    print attribute,value

1 个答案:

答案 0 :(得分:1)

你可以使用递归:

def print_leaf_keyvalues(d):
    for key, value in d.iteritems():
        if hasattr(value, 'iteritems'):
            # recurse into nested dictionary
            print_leaf_keyvalues(value)
        else:
            print key, value

演示样本数据:

>>> print_leaf_keyvalues(data)
Version 2.0
valuer 804
Address [{'CountryISOAlpha2Code': 'US', 'Address': [{'Text': {'@Value': 2, '$': 'Hill St'}}]}]
ID PRD
CountryISOAlpha2Code US
Value 804
Text Success
Severity Info
ID 2222

但是,这不会处理Address的列表值。您始终可以为序列添加其他测试,然后再次迭代和递归。