我有一个复杂的JSON文件,其中包含数百个 “属性”,它们的类型由 “objectTypeAttributeId “来标识,我知道objectTypeAttributeId=328表示tickedid,objectTypeAttributeId=329包含主机等数组。
我知道objectTypeAttributeId=328表示tickedid,objectTypeAttributeId=329包含主机名数组等。
有一个简化版的文件。
{
"objectEntries": [
{
"attributes": [
{
"id": 279792,
"objectTypeAttributeId": 328,
"objectAttributeValues": [
{
"displayValue": "ITSM-24210"
}
]
},
{
"id": 279795,
"objectTypeAttributeId": 329,
"objectAttributeValues": [
{
"displayValue": "testhost1"
},
{
"displayValue": "testhost2"
}
]
},
{
"id": 279793,
"objectTypeAttributeId": 330,
"objectAttributeValues": [
{
"displayValue": "28.02.2020 11:45"
}
]
}
]
}
]
}
我需要用特定的值创建输出JSON(根据 “objectTypeAttributeId “的值) 从输入的JSON中挑选出来,格式如下。
{
"tickets": [
{
"ticketid": "ITSM-24210",
"hostnames": ["testhost1", "testhost2"],
"date": "28.02.2020 11:45"
}
]
}
我是jq的新手,在XSLT中,可以使用静态模板和占位符来解决挑选出来的值。
我已经尝试过这种方法,这是我的jq过滤器。
.objectEntries[].attributes[] |
{ticketid: select(.objectTypeAttributeId == 328) | .objectAttributeValues[0].displayValue},
{hostnames: select(.objectTypeAttributeId == 329) | [.objectAttributeValues[].displayValue]},
{date: select(.objectTypeAttributeId == 330) | .objectAttributeValues[0].displayValue}
但是这种方法的结果是:
{
"ticketid": "ITSM-24210"
}
{
"hostnames": [
"testhost1",
"testhost2"
]
}
{
"date": "28.02.2020 11:45"
}
而我后来为了更好地格式化输出的所有尝试,都以jq过滤器损坏或过滤器不返回任何内容而告终。
请问有什么办法可以解决这个问题?
解决方案:
假设每个对象条目都要生成一个票据。
{tickets: [
.objectEntries[]
| [.attributes[]
| [.objectTypeAttributeId,
(.objectAttributeValues | map(.displayValue))] as [$id, $val]
| if $id == 328 then {ticketId: $val[0]}
elif $id == 329 then {hostnames: $val}
elif $id == 330 then {date: $val[0]}
else empty end
] | add
]}