首页 > 解决方案 > 嵌套数组,使用 JQ 组合多个过滤器

问题描述

我有一些 JSON,其中包含我要收集的每件东西的嵌套数组。

我在这里提炼了它:

[
    [
        {
            "Item":"FIRST",
            "items":[
                        {
                            "firstitem1":"Item 1",
                            "firstitem2":"Item 2"
                        }
                    ]
        }
    ],
    [
        {
            "Item":"SECOND",
            "items":[
                        {
                            "seconditem1":"Second Item 1",
                            "seconditem2":"Second Item 2"
                        }
                    ]
        }
    ]
]

所需的输出如下所示:

{
  "FirstItem1": "Item 1",
  "SecondItem1": "Second Item 1"
}

我可以使用单独返回每个项目

.[0] | {FirstItem1: .[0].items[0].firstitem1}
.[1] | {seconditem: .[0].items[0].seconditem1}

我发现了一个类似的问题,它解释了您可以使用 filter + (filter) 之类的东西连接过滤器: Multiple filters using JQ

然而,虽然我上面的两个过滤器都是独立工作的,但当我以这种方式连接它们时:

.[0] | {FirstItem1: .[0].items[0].firstitem1} + (.[1] | {seconditem: .[0].items[0].seconditem1})

我的第二个回复为“空”。

{
  "FirstItem1": "Item 1",
  "seconditem": null
}

这几天我一直在挠头,有什么想法吗?如果我应该以不同的方式进行攻击,我将不胜感激。

这是一个 jqplay 链接 https://jqplay.org/s/By94hv9gKj

标签: jsonfilterjq

解决方案


这几天我一直在挠头

当你看到你离得有多近时,你可能会想拔掉一些头发。基本上,您只需要一对额外的括号:

(.[0] | {FirstItem1: .[0].items[0].firstitem1}) + 
(.[1] | {seconditem: .[0].items[0].seconditem1})

除非您可能将“SecondItem1”作为第二个键名。

替代

这是一个重复性较低的解决方案,可能值得考虑:

[.[][] | .items[0]]
| {FirstItem1: first(.[0][]), SecondItem1: first(.[1][])}

推荐阅读