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:如果字段为空或不存在,如何删除?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:如何查询字段为空或未设置的记录?

如果另一个字段为空,则将字段更新为空或删除行

在查询SQL语句中为空或不为空怎么写

BigQuery bq 命令 - 仅在表为空或不存在时加载

Node.js 请求下载文件有时为空或不存在

如何从 nsmutabledictionary 中删除键当该键的值在 ios 中为空或 null 时?