首页 > 解决方案 > 用 jq 展平 JSON 结构,不重复

问题描述

我从这个结构开始:

[{
    "experiment": "ex1",
    "models": [{
        "name": "model1",
        "reference": 0.1,
        "code": [{
            "name": "foo",
            "version": "a",
            "value": 0.2
        },{
            "name": "foo",
            "version": "b",
            "value": 0.2
        },{
            "name": "bar",
            "version": "a",
            "value": 0.15
        }]
    },{
        "name": "model2",
        "reference": 0.12,
        "code": [{
            "name": "foo",
            "version": "a",
            "value": 0.09
        },{
            "name": "baz",
            "version": "a",
            "value": 0.15
        }]
    }]
}]

我想要这个结果:

{
  "model": "model1",
  "code": "foo",
  "version": "a"
}
{
  "model": "model1",
  "code": "foo",
  "version": "b"
}
{
  "model": "model1",
  "code": "bar",
  "version": "a"
}
{
  "model": "model2",
  "code": "foo",
  "version": "a"
}
{
  "model": "model2",
  "code": "baz",
  "version": "a"
}

所以我写了以下查询。

.[] | { "model": .name, "code": .code[].name, "version": .code[].version }

问题在于,对于.code[]输出结构中的每次使用,结果都会相乘,从而导致许多重复。我怎样才能避免这种情况,只得到想要的结果?

标签: jsonjq

解决方案


在[1] [2] [3] [4] ...之前已经提出了许多类似的问题。您需要避免多次扩展同一个数组,如下所示,以防止组合爆炸。

.[].models[] | {model: .name} + (.code[] | {name, version})

在线演示


推荐阅读