首页 > 解决方案 > 根据值过滤 JSON

问题描述

我希望仅从 UserStatus = FORCE_CHANGE_PASSWORD 的记录中获取电子邮件地址。

{
    "Users": [
        {
            "Username": "",
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": ""
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                },
                {
                    "Name": "email",
                    "Value": "john@example.com"
                }
            ],
            "UserCreateDate": "",
            "UserLastModifiedDate": "",
            "Enabled": true,
            "UserStatus": "CONFIRMED"
        },
        {
            "Username": "",
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": ""
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                },
                {
                    "Name": "email",
                    "Value": "jane@example.com"
                }
            ],
            "UserCreateDate": "",
            "UserLastModifiedDate": "",
            "Enabled": true,
            "UserStatus": "FORCE_CHANGE_PASSWORD"
        }
    ]
}

我有下面的表达式可以工作,但现在我需要弄清楚如何获取包含电子邮件地址的第三个值键,同时省略前 2 个值键。

jq ".Users[] | select(.UserStatus | contains(\"FORCE_CHANGE_PASSWORD\")) | {UserStatus: .UserStatus, Values: [.Attributes[].Value]}" userlist.json

标签: jsonjq

解决方案


  1. 发布的 JSON 不太有效,因此以下假设已删除多余的逗号。

  2. 使用更正后的 JSON,发布的程序会产生预期的结果:

{
  "UserStatus": "FORCE_CHANGE_PASSWORD",
  "Values": [
    "",
    "true",
    "jane@example.com"
  ]
}
  1. 由于您表示您只想要电子邮件地址,因此您可能想要更接近:
.Users[]
| select(.UserStatus | contains("FORCE_CHANGE_PASSWORD"))
| {UserStatus, email: (.Attributes | from_entries.email) }

产生:

{
  "UserStatus": "FORCE_CHANGE_PASSWORD",
  "email": "jane@example.com"
}

或者只是 .email 的值:

.Users[]
| select(.UserStatus | contains("FORCE_CHANGE_PASSWORD"))
| .Attributes[]
| select(.Name == "email").Value
  1. 如果您想根据 .UserStatus 等于“FORCE_CHANGE_PASSWORD”进行过滤,您当然会使用==.

  2. 请注意,UserStatus: .UserStatus可以缩写为仅UserStatus在文字对象规范中。


推荐阅读