0

我有以下 JSON。我想根据他们的 CC 角色获取键值对对象。在此示例中,有 3 个角色(Presenter、Approver、Customer)。Presenter 类型为TO。其他 2 个是 type CC。我想得到 type CC。可以有更多,因为它是动态的。

JSON

{
   "Presenter_TO_Email": "roney@domain.com",
   "Approver_CC_Email": "tim@domain.com",
   "Customer_CC_Email": "alex@domain.com",   
   "Invoice": "001",
   "Date": "2022-02-14"   
}

输出

{
    "Approver": {
      "email_address": "tim@domain.com",
      "role": "Approver"
    },
    "Customer": {
      "email_address": "alex@domain.com",
      "role": "Customer"
    }
}

我可以使用示例使用 INDEX,但由于我使用的是旧版本jq,它会引发错误jq: error: INDEX/2 is not defined at <top-level>, line 1:

4

2 回答 2

1

用于with_entries根据键和值进行更改:

jq '
  with_entries(
    (.key / "_CC_") as $key | select($key[1])
    | {key: $key[0], value: {email_address: .value, role: $key[0]}}
  )
'
{
  "Approver": {
    "email_address": "tim@domain.com",
    "role": "Approver"
  },
  "Customer": {
    "email_address": "alex@domain.com",
    "role": "Customer"
  }
}

演示

于 2022-02-21T19:02:41.583 回答
1

在包含的 jq 版本中INDEX/2,它被定义为一个简单的 jq 函数,因此如果您的 jq 不包含它,您可以自己简单地包含它的定义:

def INDEX(stream; idx_expr):
  reduce stream as $row ({};
    .[$row|idx_expr|
      if type != "string" then tojson
      else .
      end] |= $row);
于 2022-02-22T07:21:18.190 回答