如何使用JQ连接JSON中不同类型的多个字段?

时间:2018-07-19 16:39:03

标签: json jq

我有一个具有以下格式的JSON文件:

[System.Collections.ObjectModel.Collection[psobject]]

从这里开始,我想要实现的是合并/连接字段,这样我就可以得到如下输出:

[
  {
    "A": "A1",
    "B": [
      {
        "B_array": [
          {
            "B_field1": "B1",
            "B_field2": "B2"
          }
        ],
        "C": 10,
        "E": "E1"
      },
      {
        "B_array": [
          {
            "B_field1": "B3",
            "B_field2": "B4"
          }
        ],
        "C": 20,
        "E": "E2"
      }
    ],
    "F": "F1"
  }
 ]

到目前为止,我所做的是:

["A1" "B1, B2" 10 "E1" "F1"]
["A1" "B3, B4" 20 "E2" "F1"]

但是我得到的是每种可能的组合,例如:

map(.A + (.B[].C|tostring)+.B[].E+(.B[].B_array[] | join(" | ")+.F))

如何使用正确的jq查询获得上面期望的结果?

谢谢。

1 个答案:

答案 0 :(得分:1)

您要在处理每个B元素时将每个对象保存在顶级列表中,以备后用。

$ jq -c '.[] as $top | .[].B[] | [$top.A, (.B_array[] | join(", ")), .C, .E, $top.F]' tmp.json
["A1","B1, B2",10,"E1","F1"]
["A1","B3, B4",20,"E2","F1"]

变量赋值可以看作是一个过滤器,该过滤器将其输入不变地传递,但是为给定表达式提供了名称。也就是说,$top.[],除了.是指分配过滤器的输入,而不是当前输入。