如何使用jq过滤JSON对象数组?

9
我已经走到了这一步。
json输入,“data.json”:
[
  {
    "Selected": null,
    "Family Name": "Jones",
    "Couple Name": "Jones, Adam & Rachael Margaret",
    "Family Phone": "404-4477",
    "Family Email": "email@sbcglobal.net",
    "Family Address": "777 Aggies Court Kindly, California 95388 ",
    "Head Of House Name": "Jones, Adam",
    "Head Of House Phone": "(583) 404-2488",
    "Head Of House Email": "email@sbcglobal.net",
    "Spouse Name": "Jones, Rachael Margaret",
    "Spouse Phone": null,
    "Spouse Email": null,
    "Child Name": null,
    "Child Phone": null,
    "Child Email": null
  },
  {
    "Selected": "x",
    "Family Name": "Xiong",
    "Couple Name": "Xiong, Arlene Frances",
    "Family Phone": null,
    "Family Email": null,
    "Family Address": "888 Walnut Ave. Blatant, California 95388 ",
    "Head Of House Name": "Xiong, Arlene Frances",
    "Head Of House Phone": "583-500-7917",
    "Head Of House Email": "email@junk.net",
    "Spouse Name": null,
    "Spouse Phone": null,
    "Spouse Email": null,
    "Child Name": null,
    "Child Phone": null,
    "Child Email": null
  },
  {
    "Selected": "x",
    "Family Name": "Blair",
    "Couple Name": "Blair, Toby & Silvia",
    "Family Phone": "358-4645",
    "Family Email": null,
    "Family Address": "333 Cindy St. Stoic, California 95388 ",
    "Head Of House Name": "Blair, Toby",
    "Head Of House Phone": null,
    "Head Of House Email": "email@stuff.net",
    "Spouse Name": "Blair, Silvia",
    "Spouse Phone": null,
    "Spouse Email": null,
    "Child Name": null,
    "Child Phone": null,
    "Child Email": null
  }
]

我可以使用这个来筛选:
cat data.json | jq '.[] | select(.Selected != null) | {"Head Of House Name", "Head Of House Phone", "Head Of House Email", "Family Phone", "Family Email"}'

结果:
{
  "Head Of House Name": "Xiong, Arlene Frances",
  "Head Of House Phone": "583-500-7917",
  "Head Of House Email": "email@junk.net",
  "Family Phone": null,
  "Family Email": null
}
{
  "Head Of House Name": "Blair, Toby",
  "Head Of House Phone": null,
  "Head Of House Email": "email@stuff.net",
  "Family Phone": "358-4645",
  "Family Email": null
}

注意,在对象数组周围没有数组括号,对象之间也没有逗号...这表明结果不是一个数组。
问题在于结果不是对象数组(说实话,我不确定它是什么)。我怎样才能从一个 JSON 对象数组开始,对它们进行过滤,并最终得到一个过滤后的对象列表?

你的问题对我很有帮助,作为从JSON数组中提取特定JSON对象的示例,非常感谢您发布这个问题!cat data.json | jq '.[] | select(.presetName == "presetOne")' > "presetOne.json" - ChrisPrime
1个回答

16
当您使用.[]过滤器时,实际上是将数组结果拆分为每个项目的单独结果。最终看到的是一个接一个的各个单独的结果。
为确保它们保持为数组,可以通过在过滤器周围添加方括号来将结果放回数组中:
[
    .[] |
    select(.Selected != null) |
    {
        "Head Of House Name",
        "Head Of House Phone",
        "Head Of House Email",
        "Family Phone",
        "Family Email"
    }
]

或者通过使用map()方法将其保留为数组,然后可以删除.[]部分:

map(
    select(.Selected != null) |
    {
        "Head Of House Name",
        "Head Of House Phone",
        "Head Of House Email",
        "Family Phone",
        "Family Email"
    }
)
如果你问我,你应该坚持使用map()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接