微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JQ:如果字段为空或不存在,如何删除字段?

如何解决JQ:如果字段为空或不存在,如何删除字段?

如果字段为空或不存在,我需要删除它。 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 删除所有语句,我没有得到任何响应。

解决方法

如果字段为空或不存在,如何删除字段?

如果 $o 是一个可能有也可能没有键的对象,比如 $k,然后删除键,如果它的值为空,否则保留 $o 原样,你可以写:

$o | if .[$k] == null then del(.[$k]) else . end

或者如果键足够简单(基本上是带有前导字母的字母数字,其中“alpha”包括“_”),您可以按照以下方式编写表达式:

$o | if .k == null then del(.k) else . end
,

您可以简单地有条件地创建字段,而不是创建该字段然后删除它。

将键 $k 有条件地添加到对象 $o 的一个简单而健壮的(jq 的 w.r.t. 版本)方法是使用模板:

$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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。