根据值过滤JSON

时间:2020-11-06 05:50:18

标签: json jq

我希望仅从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"
        }
    ]
}

下面的表达式可以工作,但是现在我需要弄清楚如何在删除前两个Value键的同时获取包含电子邮件地址的3rd Value键。

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

1 个答案:

答案 0 :(得分:0)

  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