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

Python 在不均匀的JSON对象中输出每个属性、值,python,json,Python,Json,我有一个非常长且不均匀的JSON对象,我想输出对象端点(叶子)的每个属性和值 例如,它可能看起来像这样: data = { "Response": { "Version": "2.0", "Detail": { "TransactionID": "Ib410c-2", "Timestamp": "04:00" }, "Transaction": { "S

我有一个非常长且不均匀的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

您可以使用递归:

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

但是,这不会处理
地址的列表值。您总是可以为序列添加额外的测试,然后再次迭代和递归。

+1但是为什么更喜欢
hasattr(value,'iteritems')
而不是
isinstance(value,dict)
?@That1Guy:我更喜欢duck类型;递归调用只需要一个支持
iteritems()
的对象;这里支持什么其他方法并不重要。如果您想进一步研究它呢?例如,将地址扩展为:CountryISOAlpha2Code:US、@Value:2、$:HillSt@user1889575:然后必须展开递归函数来处理列表。不完全是重复的,但密切相关: