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 }]'