我有以下数据集:

{
  "data": {
    "system": [
      {
        "login": "vault keystore password",
        "password": "123456"
      },
      {
        "login": "vault keystore masked",
        "password": "MASK-789101112"
      },
      {
        "login": "vault salt",
        "password": "toto"
      },
      {
        "login": "vault iteration",
        "password": "10"
      },
      {
        "login": "keystore Alias",
        "password": "vault"
      }
    ]
  }
}

当登录是"vault keystore password"时,我想在我的shell 中检索密码.

我找到的最接近的是: .data.system |map_values(select(.login == "vault keystore password"))[].password个 但它返回的不是预期的输出(我想要123456):

"123456"
"toto"
"vault"

你能给我解释一下正确的语法吗?

推荐答案

只用map(select(..))个就能解决你的问题.

.data.system | map(select(.login == "vault keystore password"))[].password

根据官方文件,使用map_values()也应该可以.由于某些原因,jq(JQ-1.6)在用于此过滤器时行为不佳(可能是错误).同样的过滤器在gojq的情况下也能很好地工作.

builtin.jq个人,map_values(..)就是

def map_values(f): .[] |= f;

所以从本质上讲,你的过滤器归结为

.data.system[] |= select(.login == "vault keystore password")

这在列表system内产生了3个对象,这是不正确的.另一方面,gojq正确地处理了它.我认为整个问题都与jq(即|=)的更新赋值操作符有关,众所周知,它在过go 曾引起过问题.见https://github.com/stedolan/jq/issues/2051

jq已经被困在发布的边缘有一段时间了(https://github.com/stedolan/jq/issues/2305).因此,在新的版本>;1.6发布之前,gojq将是一个理想的替代品,可以解决许多已知的问题(JQ的问题).


gojq版本0.12.12上

echo '{"data":{"system":[{"login":"vault keystore password","password":"123456"},{"login":"vault keystore masked","password":"MASK-789101112"},{"login":"vault salt","password":"toto"},{"login":"vault iteration","password":"10"},{"login":"keystore Alias","password":"vault"}]}}' |
  gojq '.data.system | map_values(select(.login == "vault keystore password"))[].password' 

"123456"

Json相关问答推荐

震击:三针并用震击

替换字符串中特殊字符的Jolt变换

在解码的JSON哈希中搜索数组元素

处理输入数据并转换为更简单的格式-PowerBI

JQ:获取该值的较短语法是什么

解析Ansible AWS ec2_security_group中的json以提取安全组ID

Jolt 变换以展平 json 字符串数组

使用 jq 获取所有嵌套键和值

PowerShell - 将 json 添加到文件内容

将 JSON 字符串解析为 Kotlin Android 中的对象列表(MOSHI?)

派生类的属性没有得到价值

如何在 Postman 中匹配 json 响应中的内容?并可视化

传统编程语言等价于动态 SQL

如何判断 Json 对象中是否存在键并获取其值

Flask 请求和 application/json 内容类型

在 HTML 数据属性上添加 JSON 是不是很糟糕?

严重:找不到媒体类型 = 应用程序/json、类型 = 类 com.jersey.jaxb.Todo、通用类型 = 类 com.jersey.jaxb.Todo 的 MessageBodyWriter

如何在spark 上将json字符串转换为数据帧

如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性

按键值过滤 JSON