解析 Python 中的嵌套 JSON(?) 对象
Parsing a nested JSON(?) object in Python
我使用 zeep 调用网络服务。
response = proces.service.Load(**params2, _soapheaders={'Header': header_value})
这个returns一个看起来像这样的对象
{
'LoadResult': None,
'hierarchy': {
'Code': 'FTE',
'Name': 'Balans en Winst & verlies',
'Description': None,
'RootNode': {
'Id': 757,
'Code': 'FTE',
'Name': 'Balans en Winst & verlies',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 758,
'Code': '000',
'Name': 'Immateriële vaste activa',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 759,
'Code': '00010',
'Name': 'Goodwill',
'Description': None,
'Accounts': {
'HierarchyAccount': [
{
'Type': 'BAS',
'Code': '0100',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0105',
'BalanceType': 'Balance'
}
]
},
'ChildNodes': None,
'Messages': None,
'Touched': 173
}
]
},
'Messages': None,
'Touched': 173
},
{
'Id': 760,
'Code': '010',
'Name': 'Materiële vaste activa',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 761,
'Code': '01010',
'Name': 'Bedrijfsgebouwen en -terreinen',
'Description': None,
'Accounts': {
'HierarchyAccount': [
{
'Type': 'BAS',
'Code': '0090',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0110',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0115',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0120',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0125',
'BalanceType': 'Balance'
}
]
},
'ChildNodes': None,
'Messages': None,
'Touched': 173
},
{
'Id': 762,
'Code': '01020',
'Name': 'Machines en installaties',
'Description': None,
'Accounts': {
等等
我想要这份报告的层次结构。我希望结果 table 看起来像
所以从左到右从最低层次开始。
我怎样才能最好地做到这一点?这不仅仅是一个简单的 json 响应。说不能序列化。
和
我读到 JSON 不应该有单引号。当我尝试更正时:
Jsonlint 在粘贴用双引号更正的字符串时这样说
JSON 已经被 API 库解析,它构建了一个可以使用属性访问的对象层次结构。 class 显然也提供了它自己的 __repr__()
方法,使它看起来像字典的层次结构;但它实际上不是字典,所以你不能使用 ['Attribute']
语法。
如果您想遍历 HierarchyNode
列表,您可以使用
for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
print(node.Id, node.Name, node.Code)
使用
让它工作
for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
if(hasattr(node.ChildNodes, 'HierarchyNode')):
for nood in node.ChildNodes.HierarchyNode:
if(hasattr(nood.Accounts, 'HierarchyAccount')):
for noodje in nood.Accounts.HierarchyAccount:
print(noodje.Code, noodje.Type,node.Id,node.Name,nood.Name, nood.Code)
我使用 zeep 调用网络服务。
response = proces.service.Load(**params2, _soapheaders={'Header': header_value})
这个returns一个看起来像这样的对象
{
'LoadResult': None,
'hierarchy': {
'Code': 'FTE',
'Name': 'Balans en Winst & verlies',
'Description': None,
'RootNode': {
'Id': 757,
'Code': 'FTE',
'Name': 'Balans en Winst & verlies',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 758,
'Code': '000',
'Name': 'Immateriële vaste activa',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 759,
'Code': '00010',
'Name': 'Goodwill',
'Description': None,
'Accounts': {
'HierarchyAccount': [
{
'Type': 'BAS',
'Code': '0100',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0105',
'BalanceType': 'Balance'
}
]
},
'ChildNodes': None,
'Messages': None,
'Touched': 173
}
]
},
'Messages': None,
'Touched': 173
},
{
'Id': 760,
'Code': '010',
'Name': 'Materiële vaste activa',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 761,
'Code': '01010',
'Name': 'Bedrijfsgebouwen en -terreinen',
'Description': None,
'Accounts': {
'HierarchyAccount': [
{
'Type': 'BAS',
'Code': '0090',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0110',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0115',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0120',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0125',
'BalanceType': 'Balance'
}
]
},
'ChildNodes': None,
'Messages': None,
'Touched': 173
},
{
'Id': 762,
'Code': '01020',
'Name': 'Machines en installaties',
'Description': None,
'Accounts': {
等等
我想要这份报告的层次结构。我希望结果 table 看起来像
所以从左到右从最低层次开始。
我怎样才能最好地做到这一点?这不仅仅是一个简单的 json 响应。说不能序列化。
和
我读到 JSON 不应该有单引号。当我尝试更正时:
Jsonlint 在粘贴用双引号更正的字符串时这样说
JSON 已经被 API 库解析,它构建了一个可以使用属性访问的对象层次结构。 class 显然也提供了它自己的 __repr__()
方法,使它看起来像字典的层次结构;但它实际上不是字典,所以你不能使用 ['Attribute']
语法。
如果您想遍历 HierarchyNode
列表,您可以使用
for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
print(node.Id, node.Name, node.Code)
使用
让它工作 for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
if(hasattr(node.ChildNodes, 'HierarchyNode')):
for nood in node.ChildNodes.HierarchyNode:
if(hasattr(nood.Accounts, 'HierarchyAccount')):
for noodje in nood.Accounts.HierarchyAccount:
print(noodje.Code, noodje.Type,node.Id,node.Name,nood.Name, nood.Code)