json parsing help

Hi everyone, I’m just learning ansible and having some trouble parsing out some json data. I’m hoping someone can help me. What I’m looking for is the Name field at hc_pim_info.dpListProcessesReply.dpServiceList.dpService

I can get to this level, but can’t get past the array and then the @Name. When I do, I get errors like this:
“msg”: “template error while templating string: expected name or number. String: {{ hc_pim_info.dpListProcessesReply.dpServiceList.dpService[0]."@Name" }}”

I’ve tried a handful of combos to get this but nothing seems to work. Any help would be appreciated.

Here is the sample data, the data I’m after is in bold:

“hc_pim_info”: {
“dpListProcessesReply”: {
@ReturnCode”: “0”,
@xmlnsdp”: “http//www.cisco.com/vtg/diagnosticportal”,
“dpSchema”: {
@Version”: “1.0”
},
“dpServiceList”: {
“dpService”: [
{
@Name”: “CTI Server 1A”,
“dpProcessList”: {
“dpProcessProp”: [
{
@Description”: “Node Manager”,
@Name”: “nodeman.exe”,
@UpTime”: “10.052531.5637483”
},
{
@Description”: “Node Manager Manager”,
@Name”: “nmm.exe”,
@UpTime”: “10.052528.7086193”
},
{
@Description”: “CTISrvr”,
@Name”: “ctisrvr.exe”,
@Status”: “test-CG1A ctisvr - [ACTIVE myserver SecurityMode - MIXED (NonSecurePort 42027, SecurePort 42030)]”,
@UpTime”: “10.052528.6358605”
}
]
}
},
{
@Name”: “Peripheral Gateway 101A”
},
{
@Name”: “Peripheral Gateway 1A”,
“dpProcessList”: {
“dpProcessProp”: [
{
@Description”: “Node Manager”,
@Name”: “nodeman.exe”,
@UpTime”: “10.052531.6053188”
},
{
@Description”: “Node Manager Manager”,
@Name”: “nmm.exe”,
@UpTime”: “10.052528.7846315”
},
{
@Description”: “JtapigwJVMLauncher EXE”,
@Name”: “jtapigw.exe”,
@Status”: “test-PG1A jtapigw - jgw1 - [ ACTIVE ]”,
@UpTime”: “10.052451.7927267”
},
{
@Description”: “Message Delivery System”,
@Name”: “mdsproc.exe”,
@Status”: “test-PG1A mdsproc - (InSvc Pr-Enb Clk)”,
@UpTime”: “10.052451.8051968”
},
{
@Description”: “OPC-CCE”,
@Name”: “opc-cce.exe”,
@Status”: “test-PG1A opc-cce.exe”,
@UpTime”: “10.052451.6220285”
},
{
@Description”: “PG DMP Agent”,
@Name”: “pgagent.exe”,
@Status”: “test-PG1A pgagent - (InSvc AActive BIdle)”,
@UpTime”: “10.052451.6203346”
},
{
@Description”: “EAGTPIM EXE”,
@Name”: “eagtpim.exe”,
@Status”: "test-PG1A eagtpim - pim1 - [CUCM_PG01_1 ACTIVE] ",
@UpTime”: “10.052451.5644641”
},
{
@Description”: “rttest application”,
@Name”: “testsync.exe”,
@Status”: “test-PG1A testsync”,
@UpTime”: “10.052451.5628289”
}
]
}
},
{
@Name”: “Cisco ICM Diagnostic Framework”,
“dpProcessList”: {
“dpProcessProp”: {
@Description”: “Cisco ICM Diagnostic Framework”,
@Name”: “DiagFwSvc.exe”,
@UpTime”: “10.052318.6787144”
}
}
},
{
@Name”: “Peripheral Gateway 100A”,
“dpProcessList”: {
“dpProcessProp”: [
{
@Description”: “Node Manager”,
@Name”: “nodeman.exe”,
@UpTime”: “7.015007.0718110”
},
{
@Description”: “Node Manager Manager”,
@Name”: “nmm.exe”,
@UpTime”: “7.015006.7374239”
},
{
@Description”: “Message Delivery System”,
@Name”: “mdsproc.exe”,
@Status”: “test-PG100A mdsproc - (InSvc Pr-Enb)”,
@UpTime”: “7.015006.7339806”
},
{
@Description”: “OPC-TDM”,
@Name”: “opc-tdm.exe”,
@Status”: “test-PG100A opc-tdm.exe”,
@UpTime”: “7.015006.7265826”
},
{
@Description”: “PG DMP Agent”,
@Name”: “pgagent.exe”,
@Status”: “test-PG100A pgagent - (InSvc AActive BIdle)”,
@UpTime”: “7.015006.7233020”
},
{
@Description”: “vrupim”,
@Name”: “vrupim.exe”,
@Status”: “test-PG100A vrupim - pim1 - [SECURE CVP_PG100_1 ACTIVE]”,
@UpTime”: “7.015006.7310432”
},
{
@Description”: “vrupim”,
@Name”: “vrupim.exe”,
@Status”: “test-PG100A vrupim - pim2 - [SECURE CVP_PG100_2 ACTIVE]”,
@UpTime”: “7.015006.7284294”
},
{
@Description”: “vrupim”,
@Name”: “vrupim.exe”,
@Status”: “test-PG100A vrupim - pim3 - [NON-SECURE HuCallback01 ACTIVE]”,
@UpTime”: “7.015006.7214459”
},
{
@Description”: “vrupim”,
@Name”: “vrupim.exe”,
@Status”: “test-PG100A vrupim - pim4 - [NON-SECURE HuCallback02 ACTIVE]”,
@UpTime”: “7.015006.6647717”
},
{
@Description”: “rttest application”,
@Name”: “testsync.exe”,
@Status”: “test-PG100A testsync”,
@UpTime”: “7.015006.5579308”
}
]
}
}
]
}
}
}
},

If I’m reading the json right, try: {{ hc_pim_info.dpListProcessesReply.dpServiceList.dpService[0][‘@Name’] }}

-John

Hi John,

Thank you for the response. I just tried it and got the following error:
“msg”: “template error while templating string: unexpected char u’\u2018’ at 63. String: {{ hc_pim_info.dpListProcessesReply.dpServiceList.dpService[0][‘@Name’] }}”

It just doesn’t seem to like that ‘@Name’ at all. Do you have any other suggestions?

Thanks,
Kevin

Hi John,

Thank you for the response. I just tried it and got the following error:
"msg": "template error while templating string: unexpected char u'\\u2018' at 63. String: {{ hc_pim_info.dpListProcessesReply.dpServiceList.dpService[0][‘@Name’] }}"

Must be a copy/paste error - those single quotes around @Name are not ASCII quotes:

>cat <<EOF | od -c
> [‘@Name’]
> EOF
0000000 [ 342 200 230 @ N a m e 342 200 231 ] \n
0000016

Works fine for me if I use plain ASCII single quotes.

Ahh got it! ok, that worked. 1 more question, since that is an array at dpService, I want to iterate through that. I tried leaving the brackets blank, but that failed. How would I tell it to give me each element?

Thanks for the help!
Kevin

Ahh got it! ok, that worked. 1 more question, since that is an array at dpService, I want to iterate through that. I tried leaving the brackets blank, but that failed. How would I tell it to give me each element?

I guess it depends on what you want to do with it.

Do you want to use it in a loop? https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#

Do you want to select some elements from the list? https://jinja.palletsprojects.com/en/2.11.x/templates/#select or selectattr

Do you want to perform some modification to each item? https://jinja.palletsprojects.com/en/2.11.x/templates/#map

or https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#list-filters

Hi Rich,

I’m looking to collect the name field into a list and then use that in further tasks.

Thanks,
Kevin

Hi Rich,

I'm looking to collect the name field into a list and then use that in further tasks.

Something like this:

set_fact:

keyvallist: "{{ hc_pim_info.dpListProcessesReply.dpServiceList.dpService | map(attribute='@key') | list }}"

see the examples under https://jinja.palletsprojects.com/en/2.11.x/templates/#map

awesome! thanks, I’ll try it.

Kevin