Json 是否有一个特殊值可以从jq输出中省略字段?
我可以很容易地有条件地将字段设置为Json 是否有一个特殊值可以从jq输出中省略字段?,json,key,jq,Json,Key,Jq,我可以很容易地有条件地将字段设置为null: echo'{“id”:1,“more”:“fields”}\ |jq'{newId:(如果.id==1,则为null else.id end),newMore:.more}' 屈服 { "newId": null, "newMore": "fields" } 但我怎样才能有条件地删除它呢?我要找的东西是: echo'{“id”:1,“more”:“fields”}\ |jq'{ newId:(如果.id==1,则else.id结束), n
null
:
echo'{“id”:1,“more”:“fields”}\
|jq'{newId:(如果.id==1,则为null else.id end),newMore:.more}'
屈服
{
"newId": null,
"newMore": "fields"
}
但我怎样才能有条件地删除它呢?我要找的东西是:
echo'{“id”:1,“more”:“fields”}\
|jq'{
newId:(如果.id==1,则else.id结束),
newMore:。更多
}'
屈服
{
"newMore": "fields"
}
是否存在这样的
?如果没有,还有哪些可行的解决方案?理想情况下,它们还应可用于具有许多附加字段和嵌套字段的大型对象。在这种情况下,您可能希望在if
语句中创建对象:
echo '{"id": 1}' | jq 'if .id == 1 then {} else {newId: .id} end'
我现在使用了一个解决方案,在该解决方案中,我在最后有条件地添加字段。对于这样一个小的对象,看起来有点过分了,但是如果你处理的是带有很多附加字段的较大对象,这是一种非常干净的方法
echo'{“id”:1,“more”:“fields”}\
|jq'.id作为$id
|{newMore:.more}
|如果$id==1,则为。否则,{newId:$id}end
'
您可以采用这样的约定,即如果密钥的值为null
(或nan
),则可以删除该密钥。要删除所有空值键,可以使用map_值(选择(.!=null))
(或map_值(选择(isnan | not))
)
因此,通过您的示例,我们发现:
$ echo '{"id": 1}' | jq '{newId: (if .id == 1 then null else .id end)} | map_values( select(. != null))'
{}
以及:
使用jq 1.5或更高版本,您可以使用
empty
作为“特殊值”,如下所示:
echo '{"id": 1}' | jq '. as $in
| reduce "newId" as $k (.; .[$k] = if .id == 1 then empty else .id end)'
关键是,您可以通过这种方式处理无限多个键;例如,如果您有一个要有条件地添加的键名列表,$l,您可以这样写:
reduce$l[]为$k…
您可以使用empty
作为特殊值以及/{}
:
$ echo '{"id": 1}' | jq '{newId: (if .id == 1 then empty else .id end) } // {} '
{}
此技术也可用于有条件地添加字段,例如
$ echo '{"id": 1}' | jq '. += ({newId: (if .id == 1 then empty else .id end) } // {})'
{
"id": 1
}
是否存在这样的一种情况?不,对象构造运算符(
{}
)不允许这样做。@adius-请使用empty
和/{}
来查看答案,对于小对象,这当然是一个可行的解决方案,对于大对象,则不太可行。@adius-您问的问题没有提到任何大对象。如果你真正的问题涉及大型物体,那么请在问题的主体部分详细说明。
$ echo '{"id": 1}' | jq '. += ({newId: (if .id == 1 then empty else .id end) } // {})'
{
"id": 1
}