json Jolt变换将数据从扁平数组提取到对象中

jhiyze9q  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(141)

我在从一个扁平化的数组中提取数据时遇到了一些麻烦。我正在扁平化一个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"
}

有人有什么办法能让它成功吗?

bnl4lu3b

bnl4lu3b1#

您可以生成两个不同的数组,分别表示第一个shift转换中的***name***和*population*值。然后根据这些元素在第二个转换规范中的数组中的序号来匹配它们,并在最后一个规范中为键添加前缀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标记 *

t1rydlwq

t1rydlwq2#

使用您的unflatted输入,这可能是一行程序。在这里,我们必须首先unflatted它。

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

w51jfk4q

w51jfk4q3#

为什么不:

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

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

hjson -j | jq ...

相关问题