【问题标题】:JQ: how to delete field if null or not exist?JQ:如果字段为空或不存在,如何删除?
【发布时间】: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 来响应。我在上面添加的请求和响应。

标签: null key jq exists del


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多