шаблон jinja2 для сложного парсинга json
Я изо всех сил пытаюсь заставить шаблон jinja работать для следующего - требуемый вывод на самом деле представляет собой комбинацию значения ключа «имя» и «текстовое» поле в MULTI, которое может быть списком или словарем, эти данные взяты из отчета, который мне нужно проанализировать продолжить действие над ним.
Введите Json-
{
"REPORT": {
"STATUS": "0",
"MESSAGE": null,
"EXPRESSION": [
{
"type": "multi",
"op": "is",
"cast": "Mixed",
"objlistname": "AGENT",
"objid": "1212121",
"objglobalname": "AGENT",
"MULTI": [
{
"name": "AGENT",
"INSTANCE": [
{
"name": "Server",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "test.services"
}
},
{
"name": "Media Server",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "test1.services"
}
},
{
"name": "Group",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "ABCD"
}
},
{
"name": "Schedule",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "BRAS"
}
},
{
"name": "Client",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "local"
}
},
{
"name": "Domain Name",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "/ABC"
}
},
{
"name": "Status",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "failed"
}
},
{
"name": "Started",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "1648117370"
}
},
{
"name": "Finished",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "1648120649"
}
},
{
"name": "Status Code Summary",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "Dropped Session - No progress reported."
}
},
{
"name": "Duration",
"cast": "Duration",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "3279"
}
}
]
},
{
"name": "AGENT",
"INSTANCE": [
{
"name": "Server",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "asd.services"
}
},
{
"name": "Media Server",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "bddf.services"
}
},
{
"name": "Group",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "DDDD"
}
},
{
"name": "Schedule",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "BRASddfd"
}
},
{
"name": "Client",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "abc.local"
}
},
{
"name": "Domain Name",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "/GADV"
}
},
{
"name": "Status",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "success"
}
},
{
"name": "Started",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "1648108812"
}
},
{
"name": "Finished",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "1648124485"
}
},
{
"name": "Status Code Summary",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "Activity completed with exceptions."
}
},
{
"name": "Duration",
"cast": "Duration",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648108800",
"start": "1648108800",
"text": "15673"
}
}
]
}
]
},
{
"type": "multi",
"op": "is",
"cast": "Mixed",
"objlistname": "AGENT",
"objid": "asdfasdfasfasfas",
"objglobalname": "AGENT",
"MULTI": {
"name": "AGENT",
"INSTANCE": [
{
"name": "Server",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "asdfasdf.services"
}
},
{
"name": "Media Server",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648044000",
"start": "1648044000",
"text": "basfgdasd.services"
}
},
{
"name": "Group",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "DFDFDF"
}
},
{
"name": "Schedule",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "DFDSFSD"
}
},
{
"name": "Client",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "adfasdfsa.au"
}
},
{
"name": "Domain Name",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "/MAKD"
}
},
{
"name": "Status",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648044000",
"start": "1648044000",
"text": "failed"
}
},
{
"name": "Started",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648044000",
"start": "1648044000",
"text": "1648044004"
}
},
{
"name": "Finished",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648044000",
"start": "1648044000",
"text": "1648052473"
}
},
{
"name": "Status Code Summary",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648044000",
"start": "1648044000",
"text": "Dropped Session - No progress reported."
}
},
{
"name": "Duration",
"cast": "Duration",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648044000",
"start": "1648044000",
"text": "8469"
}
}
]
}
},
{
"type": "multi",
"op": "is",
"cast": "Mixed",
"objlistname": "AGENT",
"objid": "dfasdfasf",
"objglobalname": "AGENT",
"MULTI": {
"name": "AGENT",
"INSTANCE": [
{
"name": "Server",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "abc.services"
}
},
{
"name": "Media Server",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648047600",
"start": "1648047600",
"text": "def.services"
}
},
{
"name": "Group",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "DFSFSFSDF"
}
},
{
"name": "Schedule",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "SDFSDFs"
}
},
{
"name": "Client",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "bi-pdb01"
}
},
{
"name": "Domain Name",
"cast": "String",
"key": "true",
"trend": "false",
"ITEM": {
"end": "-1",
"start": "-1",
"text": "/BINO"
}
},
{
"name": "Status",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648047600",
"start": "1648047600",
"text": "success"
}
},
{
"name": "Started",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648047600",
"start": "1648047600",
"text": "1648047608"
}
},
{
"name": "Finished",
"cast": "Int",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648047600",
"start": "1648047600",
"text": "1648050178"
}
},
{
"name": "Status Code Summary",
"cast": "String",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648047600",
"start": "1648047600",
"text": "Activity completed with exceptions."
}
},
{
"name": "Duration",
"cast": "Duration",
"key": "false",
"trend": "false",
"ITEM": {
"end": "1648047600",
"start": "1648047600",
"text": "2570"
}
}
]
}
}
]
}
}
требуется вывод -
{
"clients": [
{
"@name": "AGENT",
"INSTANCE": {
"Server": "test.services",
"Media Server": "test1.services",
"Group": "ABCD",
"Schedule": "BRAS",
"Client": "local",
"Domain Name": "/ABC",
"Status": "failed",
"Started": "1648117370",
"Finished": "1648120649",
"Status Code Summary": "Dropped Session - No progress reported.",
"Duration": "3279"
}
},
{
"@name": "AGENT",
"INSTANCE": {
"Server": "asd.services",
"Media Server": "bddf.services",
"Group": "DDDD",
"Schedule": "BRASddfd",
"Client": "abc.local",
"Domain Name": "/GADV",
"Status": "success",
"Started": "1648108812",
"Finished": "1648124485",
"Status Code Summary": "Activity completed with exceptions.",
"Duration": "15673"
}
},
{
"@name": "AGENT",
"INSTANCE": {
"Server": "asdfasdf.services",
"Media Server": "basfgdasd.services",
"Group": "DFDFDF",
"Schedule": "DFDSFSD",
"Client": "adfasdfsa.au",
"Domain Name": "/MAKD",
"Status": "failed",
"Started": "1648044004",
"Finished": "1648052473",
"Status Code Summary": "Dropped Session - No progress reported.",
"Duration": "8469"
}
},
{
"@name": "AGENT",
"INSTANCE": {
"Server": "abc.services",
"Media Server": "def.services",
"Group": "DFSFSFSDF",
"Schedule": "SDFSDFs",
"Client": "bi-pdb01",
"Domain Name": "/BINO",
"Status": "success",
"Started": "1648047608",
"Finished": "1648050178",
"Status Code Summary": "Activity completed with exceptions.",
"Duration": "2570"
}
},
]
}
Я пробовал несколько комбинаций, одна из тех, которые ближе всего подошли к решению, это
{"clients" : [
{% for agents in REPORT.EXPRESSION -%}
{% set outer_loop = loop %}
{% if agents.MULTI is iterable and (agents.MULTI is not string and agents.MULTI is not mapping) -%}
{% for record in agents.MULTI -%}
{ "client":{{record }} } {{ ", " if not outer_loop.last or not loop.last else "" }}
{%- endfor %}
{%- else %}
{ "client":{{agents.MULTI }}}{{ ", " if not loop.last else "" }}
{%- endif %}
{%- endfor %}
]}