将某些对象的字段名称替换为另一个对象的值

时间:2019-06-18 15:03:59

标签: json jq

假设我具有以下JSON数组:

[
    [
         { "value": "first_name" },
         { "value": "last_name" },
         { "value": "age" }
    ],
    [
         { "value": "John" },
         { "value": "Johnson" },
         { "value": 27 }
    ],
    [
         { "value": "Martin" },
         { "value": "Martinson" },
         { "value": 18 }
    ]
]

您可以将此JSON视为以下内容的不同视图:

| first_name | last_name | age |
|------------|-----------|-----|
| John       | Johnson   | 27  |
| Martin     | Martinson | 18  |

数组始终的第一项表示“列” ,而其他项是行。

我想将上述JSON转换为更具可读性的内容,即完全摆脱第一项,合并所有分离的对象,并相应地对字段名称进行修改:

[
    {
        "first_name": "John",
        "last_name": "Johnson",
        "age": 27
    },
    {
        "first_name": "Martin",
        "last_name": "Martinson",
        "age": 18
    }
]

理想情况下,我想使用诸如 jq 之类的CLI工具来实现这一目标-可以吗?

2 个答案:

答案 0 :(得分:1)

以下df.ID.append(df2.IA).unique().size 调用适用于您的示例输入:

jq

它提取标题,然后遍历列表的其余部分,创建一个对象,该对象具有从标题提取的键和从当前元素获取的值。

您可以try it here

尽管它只处理具有特定列数的输入,但我认为可以将第一项的值与其他项的值通用地链接起来。


编辑(macicero @)

  

这正是我想要的。我用不与列数耦合的这个版本增强了您的示例:

.[0] as $header | .[1:] | map( { ($header[0].value) : .[0].value, ($header[1].value) : .[1].value, ($header[2].value) : .[2].value } )

答案 1 :(得分:1)

这是您构建所需结果的另一种方法。

(.[0] | map({key:.value})) as $keys | [.[1:][] | [$keys,.] | transpose | map(add) | from_entries]

您可以在这里利用from_entries将标头和行视为键和值的集合。您只需要操作这些值即可将其与相应的键配对。

相关问题