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
如果.identifier
是null
,您需要处理这种情况。在这里,?
运算符可能会有所帮助。
- 没有选择
jq 'map({id, dni: (.identifier[]?).value.value})'
- 有选择
jq 'map({id, dni: (.identifier[]? | select(.system.value == "urn:oid:2.16.724.4.9.10.2")).value.value})'
[
{
"id": "f3b8c257-9950-45e7-9e79-ace19ec8905e",
"dni": "10839812"
}
]
这是我的文件:
[
{
"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
如果.identifier
是null
,您需要处理这种情况。在这里,?
运算符可能会有所帮助。
- 没有选择
jq 'map({id, dni: (.identifier[]?).value.value})'
- 有选择
jq 'map({id, dni: (.identifier[]? | select(.system.value == "urn:oid:2.16.724.4.9.10.2")).value.value})'
[
{
"id": "f3b8c257-9950-45e7-9e79-ace19ec8905e",
"dni": "10839812"
}
]