jq:应用 select 子句的位置

jq: where select clause is applied

这是我的文件:

[
   {
      "id":"f3b8c257-9950-45e7-9e79-ace19ec8905e",
      "identifier":[
         {
            "system":{
               "value":"urn:oid:2.16.724.4.9.10.2"
            },
            "value":{
               "value":"10839812"
            }
         }
      ]
   },
   {
      "id":"f0a1e3ae-826f-4a03-b29e-10ef3bc86ea0",
      "identifier":null
   }
]

目前,我正在应用这个 jq 过滤器:

map(
    {
        id,
        dni: .identifier[] | (select(.system.value == "urn:oid:1.3.6.1.4.1.19126.3") | .value.value)
    }
)

但是,我收到了这条消息:

jq: error (at practitioner-mongoexport.json:146715): Cannot iterate over null (null)

如您所料,在 .identifier: null.

处处理第二个对象时出现问题

我已经试过了:

map(
    {
        id,
        dni: select(.identifier) | .identifier[] | (select(.system.value == "urn:oid:1.3.6.1.4.1.19126.3") | .value.value)
    }
)

我也尝试过:

map(
    select(.identifier) |
    {
        id,
        dni: .identifier[] | (select(.system.value == "urn:oid:1.3.6.1.4.1.19126.3") | .value.value)
    }
)

那么结果就是[].

我不太明白我做错了什么。

我想要的输出是:

[
   {
      "id":"f3b8c257-9950-45e7-9e79-ace19ec8905e",
      "dni": "10839812"
   }
]

有什么想法吗?

map(
    select(.identifier?[]?.system.value == "urn:oid:2.16.724.4.9.10.2") 
    | { id, "dni": .identifier[].value.value }
)

将生成:

[
  {
    "id": "f3b8c257-9950-45e7-9e79-ace19ec8905e",
    "dni": "10839812"
  }
]

这里的技巧是 .identifier?[]?.system.value 如果 null

? 将忽略 .identifier

JqPlay Demo

如果.identifiernull,您需要处理这种情况。在这里,? 运算符可能会有所帮助。

  • 没有选择
jq 'map({id, dni: (.identifier[]?).value.value})'

Demo

  • 有选择
jq 'map({id, dni: (.identifier[]? | select(.system.value == "urn:oid:2.16.724.4.9.10.2")).value.value})'

Demo

[
  {
    "id": "f3b8c257-9950-45e7-9e79-ace19ec8905e",
    "dni": "10839812"
  }
]