Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 是否有一个特殊值可以从jq输出中省略字段?_Json_Key_Jq - Fatal编程技术网

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
}