Json jq根据优先级和条件获取第一个值
我有以下建议:Json jq根据优先级和条件获取第一个值,json,conditional-statements,jq,Json,Conditional Statements,Jq,我有以下建议: { "Detail": { "Response": [ { "ID": "8000000D-1483989576", "Name": "", "FullName": "FullName 1" }, { "ID": "8000000C-1483985849", "Name": "Name 1" }, { "ID":
{
"Detail": {
"Response": [
{
"ID": "8000000D-1483989576",
"Name": "",
"FullName": "FullName 1"
},
{
"ID": "8000000C-1483985849",
"Name": "Name 1"
},
{
"ID": "80000006-1481277410",
"Name": "Name 2",
"FullName": "FullName 2"
},
{
"ID": "8000000B-1481537384",
"Name": "Name 3"
}
]
}
}
我尝试创建另一个JSON,它将考虑非空/非null <代码> .Name <代码>作为优先级,否则得到<代码> .FultName < /C> >不管它是空的还是空的,最后JSON看起来如下:
[
{
"id": "8000000D-1483989576",
"name": "FullName 1"
},
{
"id": "8000000C-1483985849",
"name": "Name 1"
},
{
"id": "80000006-1481277410",
"name": "FullName 2"
},
{
"id": "8000000B-1481537384",
"name": "Name 3"
}
]
我得到的临时解决方案是使用join
jq '[.Detail.Response[] | {id: .ID, name: [.Name, .FullName] | join("") }]'
但当然,只有当
.FullName
为空或null时,它才会起作用。这应该可以帮助您:
.Detail.Response[]
| { id: .ID, Name: (if .Name != "" then .Name else .FullName end) }
我用
map
和select
找到了一种方法
jq '[.Detail.Response[] | {id: .ID, name: [.Name, .FullName] | map(select(length > 0)) | first }]'