如何使用jq对可能缺少的数组进行排序?

时间:2018-01-17 16:56:35

标签: arrays json sorting edit jq

给出以下JSON:

{
  "alice": { "items": ["foo", "bar"] },
  "bob": { "items": ["bar", "foo"] },
  "charlie": { "items": ["foo", "bar"] }
}

我可以按如下方式对items数组进行排序:

$ jq < users.json 'map(.items |= sort)'
[
  {
    "items": [
      "bar",
      "foo"
    ]
  },
  {
    "items": [
      "bar",
      "foo"
    ]
  },
  {
    "items": [
      "bar",
      "foo"
    ]
  }
]

但是,如果任何用户没有items

,则会崩溃
{
  "alice": { "items": ["foo", "bar"] },
  "bob": { "items": ["bar", "foo"] },
  "charlie": {}
}

尝试对其进行排序会产生错误。

$ jq < users.json 'map(.items |= sort)'
jq: error (at <stdin>:5): null (null) cannot be sorted, as it is not an array

我如何获得以下内容?

$ jq < users.json SOMETHING
[
  {
    "items": [
      "bar",
      "foo"
    ]
  },
  {
    "items": [
      "bar",
      "foo"
    ]
  },
  {
    "items": [
    ]
  }
]

我尝试过使用// [],但我不确定如何在排序方面做到这一点。

2 个答案:

答案 0 :(得分:2)

如果使用map_values映射对象的值,则可以保留原始结构。然后,从那里,如果你想保留items数组的缺席,只需事先检查它。

map_values(if has("items") then .items |= sort else . end)

否则,如果您不关心添加空项目:

map_values(.items |= (. // [] | sort))

答案 1 :(得分:1)

啊哈,这似乎有效:

$ jq < users.json 'map(.items |= (. // [])) | map(.items |= sort)'