如何从嵌套的 json 对象中保留一个特定的键?

如何从嵌套的 json 对象中保留一个特定的键?

我有以下config.json文件:

{
        "auths": {
                "reg1.io": {
                        "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                },
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                },
                "reg3.io": {
                        "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
                }
        }
}

我只想保留reg2.io要获取的对象:

{
        "auths": {
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                }
        }
}

我可以删除一个特定的对象,例如:

→ jq 'del(.. | ."reg2.io"? )' ./config.json
{
  "auths": {
    "reg1.io": {
      "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "reg3.io": {
      "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    }
  }
}

但如果我想保留一个特定的对象怎么办?谢谢。

答案1

使用select()withwith_entries()仅选择您想要的键:

$ jq '.auths |= with_entries(select(.key == "reg2.io"))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

参数化,以便它从命令行获取所需的密钥:

$ jq --arg key "reg2.io" '.auths |= with_entries(select(.key == $key))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

更改==!=以删除指定的键。

请注意,您自己的尝试无法区分密钥在文档中的位置,这在一般情况下可能会导致一些混乱。


只是为了对表达式中发生的情况添加更多解释jq

with_entries()命令中,可见的是以下一组对象,每个对象都有一个key和一个value键:

{
   "key": "reg1.io",
   "value": { "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
}
{
   "key": "reg2.io",
   "value": { "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" }
}
{
   "key": "reg3.io",
   "value": { "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" }
}

select()调用提取给定测试的每个对象真的,并丢弃其余的。我们的测试只是“key键的值是字符串吗reg2.io?”。

调用with_entries(expr)相当于to_entries | map(expr) | from_entries.

相关内容