Python 在不均匀的JSON对象中输出每个属性、值
我有一个非常长且不均匀的JSON对象,我想输出对象端点(叶子)的每个属性和值 例如,它可能看起来像这样:Python 在不均匀的JSON对象中输出每个属性、值,python,json,Python,Json,我有一个非常长且不均匀的JSON对象,我想输出对象端点(叶子)的每个属性和值 例如,它可能看起来像这样: data = { "Response": { "Version": "2.0", "Detail": { "TransactionID": "Ib410c-2", "Timestamp": "04:00" }, "Transaction": { "S
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:然后必须展开递归函数来处理列表。不完全是重复的,但密切相关: