Jolt Transform 将扁平数组中的数据提取到对象中

Jolt Transform extracting data from flattened array into object

我在从展平数组中提取数据时遇到了一些问题。我正在展平一个 JSON 文件,然后使用 Jolt 我正在准备数据。

具有这种结构:

{
  "body.places[0]_name": "Test",
  "body.places[0]_population": "72",
  "body.places[1]_name": "Demo",
  "body.places[1]_population": "182"
}

我正在尝试:

{
  "place_test": "72"
  "place_demo": "182"
}

有没有人对制作这个作品有任何想法?

根据您未展开的输入,这可能是 one-liner。这里,我们得先把它展开。

jq '
  to_entries
  | reduce (
      group_by((.key / "_")[0])[]
      | map(.key |= (. / "_")[1])
      | from_entries
    ) as $g (
      {};
      .["place_\($g.name | ascii_downcase)"] = $g.population
    )
'
{
  "place_test": "72",
  "place_demo": "182"
}

Demo

为什么不只是:

{ place_test: .["body.places[0]_population"],
  place_demo: .["body.places[1]_population"] }

或者如果必须处理尾随逗号:

hjson -j | jq ...

您可以生成两个不同的单独数组,分别表示 namepopulation 值分别在第一个 shift 转换中。然后根据第二个转换规范中数组中的顺序匹配这些元素,并在最后一个规范中使用 Place_ 作为键的前缀,例如

[
  {
    "operation": "shift",
    "spec": {
      "body.places\[*\]_n*": "n",
      "body.places\[*\]_p*": "p"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "p": {
        "*": "@(2,n[&])"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "Place_&"
    }
  }
]

PS : 这看起来像一个 Jolt 问题,除了 jq 标签