JQ:如果字段为空或不存在,如何删除?
Posted
技术标签:
【中文标题】JQ:如果字段为空或不存在,如何删除?【英文标题】:JQ: how to delete field if null or not exist? 【发布时间】:2021-02-26 11:36:50 【问题描述】:如果字段为空或不存在,我需要删除它。 Json 看起来像:
"response":
"somefield1": 0,
"somefield2": 0,
"somefield3": 0.0,
"somefield4": [
"somefield5": "abc",
"somefield6": "123",
"TheField": ["\u0000\"\"id\":\"123,SomeFields\":\"SomeField\":some data\"\u0000"]
]
JQ
SomeField: "%s",
SomeField1: "%s",
SomeField2: "a",
SomeField3: "b",
SomeField4:
a: "%s",
b: "%s"
,
SomeField5: "%s",
SomeField6: .response?.somefield4[]?.TheField[]?,
| del(.SomeField6? | nulls)
因此,如果“TheField”不存在或为空,我需要删除 SomeField6。现在,而不是删除当前字段 JQ 删除所有语句,我没有得到任何回应。
【问题讨论】:
如果字段不存在,删除是什么意思?你能发布一个清晰的输入 JSON 和预期的输出吗 我的意思是如果“TheField”不存在或为空,那么我需要删除或不添加 SomeField6 来响应。我在上面添加的请求和响应。 【参考方案1】:如果字段为空或不存在,如何删除?
如果 $o 是一个可能有也可能没有键的对象,比如 $k,那么如果它的值为 null,则删除该键,否则保持 $o 不变,你可以这样写:
$o | if .[$k] == null then del(.[$k]) else . end
或者如果键足够简单(基本上是带有前导 alpha 的字母数字,其中“alpha”包括“_”),您可以编写如下表达式:
$o | if .k == null then del(.k) else . end
【讨论】:
【参考方案2】:您可以简单地有条件地创建它,而不是创建字段然后删除它。
一个简单而健壮的(w.r.t. jq 版本)有条件地向对象 $o 添加键 $k 的方法是使用模板:
$o + (if CONDITION then ($k): $value else null end)
其中 CONDITION 和 $value 各自计算为一个值。
所以在你的情况下,你可以这样写:
((try first(.response.somefield4[].TheField[]) catch null) // null) as $value
. + (if $value then SomeField6: $value else null end)
【讨论】:
以上是关于JQ:如果字段为空或不存在,如何删除?的主要内容,如果未能解决你的问题,请参考以下文章