JQ:如何使用jq挑选的数据创建JSON对象?

我有一个复杂的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
]}

在线演示

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Google-Map-React如何获得边界内的标记?

2022-5-14 14:00:17

解决方案

shell命令是如何执行的,在什么情况下运行?

2022-5-14 15:00:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索