我有以下JSON行的示例:
{"toplevel_key": "top value 1", "list": [{"key1": "value 1", "key2": "value 2"},{"key1": "value 3", "key2": "value 4"}]}
{"toplevel_key": "top value 2", "list": [{"key1": "value 5", "key2": "value 6"}]}
我希望使用JQ将其转换,将列表展开为固定数量的“列”,最终得到一个扁平的JSON对象列表,格式如下:
{
"top-level-key": "top value 1",
"list_0_key1": "value 1",
"list_0_key2": "value 2",
"list_1_key1": "value 3",
"list_1_key2": "value 4",
}
{
"top-level-key": "top value 2",
"list_0_key1": "value 4",
"list_0_key2": "value 5",
"list_1_key1": "",
"list_1_key2": "",
}
注意:我实际上希望它们每行一个,这里格式化以提高可读性。
我能够获得想要的输出的唯一方法是在我的JQ表达式中写出所有列:
$ cat example.jsonl | jq -c '{toplevel_key, list_0_key1: .list[0].key1, list_0_key2: .list[0].key2, list_1_key1: .list[1].key1, list_1_key2: .list[1].key2}'
这个方法可以得到我想要的结果,但是我必须手动编写所有固定的“列”(在生产中将会有更多)。
我知道我可以使用脚本来生成那段JQ代码,但我不感兴趣使用这样的解决方案——因为它不能解决我的问题,因为这是一个只接受JQ的应用程序。
有没有一种纯JQ的方法可以实现呢?
这是我目前能够得到的:
$ cat example.jsonl | jq -c '(.list | to_entries | map({("list_" + (.key | tostring)): .value})) | add'
{"list_0":{"key1":"value 1","key2":"value 2"},"list_1":{"key1":"value 3","key2":"value 4"}}
{"list_0":{"key1":"value 5","key2":"value 6"}}
//
运算符,真是有用的东西! 谢谢! - Elias Dorneles