从jq输出元素创建一个新的json字符串

时间:2018-12-31 12:48:20

标签: json jq

我的jq命令返回括号中的对象,但不带逗号分隔符。但是我想从中创建一个新的json字符串。

此调用查找其中包含arr的{​​{1}}的所有元素,然后从嵌套数组的索引FooItem返回texts

3

在此json上(原始元素包含更多元素):

jq '.arr[] | select(index("FooItem")) | .[3].texts' 

返回此输出:

 {
      "arr": [
        [
          "create",
          "w199",
          "FooItem",
          {
            "index": 0,
            "texts": [
              "aBarfoo",
              "avalue"
            ]
          }
        ],
        [
          "create",
          "w200",
          "NoItem",
          {
            "index": 1,
            "val": 5,
            "hearts": 5
          }
        ],
        [
          "create",
          "w200",
          "FooItem",
          {
            "index": 1,
            "texts": [
              "mybarfoo",
              "bValue"
            ]
          }
        ]
    ]
    }

但是我想从这些看起来像这样的对象中创建一个新的json:

[
  "aBarfoo",
  "avalue"
]
[
  "mybarfoo",
  "bValue"
]

jq可以这样做吗?

编辑

又一个补充:考虑到文本也有长度为零的字符串,您如何删除那些/不将它们包含在结果中?

{
    "arr": [
        [
            "aBarfoo",
            "avalue"
        ],
        [
            "mybarfoo",
            "bValue"
        ]
    ]
}

1 个答案:

答案 0 :(得分:2)

您始终可以通过装饰流(即在当前情况下,如下所示包装STREAM),将(零个或多个)JSON实体流嵌入到其他JSON结构中:

{ arr: [ STREAM ] }

但是,在当前情况下,我们还可以认为我们只是在编辑原始文档,因此使用了map(select(...))惯用语的变体:

.arr |= map( select(index("FooItem")) | .[3].texts) 

后一种方法可确保保留“ arr”键的上下文。

附录

要过滤出空字符串,只需添加另一个map(select(...))

.arr |= map( select(index("FooItem"))
             | .[3].texts | map(select(length>0)))