json - 根据值过滤 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
解决方案
发布的 JSON 不太有效,因此以下假设已删除多余的逗号。
使用更正后的 JSON,发布的程序会产生预期的结果:
{
"UserStatus": "FORCE_CHANGE_PASSWORD",
"Values": [
"",
"true",
"jane@example.com"
]
}
- 由于您表示您只想要电子邮件地址,因此您可能想要更接近:
.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
如果您想根据 .UserStatus 等于“FORCE_CHANGE_PASSWORD”进行过滤,您当然会使用
==
.请注意,
UserStatus: .UserStatus
可以缩写为仅UserStatus
在文字对象规范中。
推荐阅读
- ios - 使用 NSPredicate 按 NSNumber 过滤自定义对象数组时遇到问题
- c# - 单击全日历上的“预订”按钮时如何更改事件的颜色
- java - 使用 google drive API 和 Java 读取共享驱动器
- javascript - 在 webstie 上显示来自 DB 的值变化
- php - Laravel,如何使用旧值对表列运行更新
- terraform - 在主输出中找不到模块源的 Terraform 输出
- javascript - 在循环中调用异步等待时出现语法错误
- javascript - Jest 测试没有通过任何参数(变为“未定义”)
- javascript - 当我从 URL 获取 json 数据时,它什么也不显示
- python - C++ vs python numpy 复杂数组性能