我有一种“JSON”(我不知道这是一种标准格式),我想用jq解析。我已经尝试了很多变化,但我无法使用jq。
“JSON”看起来像这样:
{
"headers" : [
"key1",
"key2",
"key3",
],
"rows" : [
[
"value1",
"value2",
"value3"
],
[
"value1",
"value2",
"value3"
],
[
"value1",
"value2",
"value3"
]
],
"total_rows" : "3"
}
我想将标题部分用作每行的键。所以输出应该如下所示:
[
"key1" : "value1",
"key2" : "value2",
"key3" : "value3"
],
[
"key1" : "value1",
"key2" : "value2",
"key3" : "value3"
],
[
"key1" : "value1",
"key2" : "value2",
"key3" : "value3"
]
答案 0 :(得分:0)
以下使用了jq的“map”和“reduce”过滤器;如果您不熟悉其中任何一个,请查阅jq文档。
为清楚起见,以下解决方案使用辅助函数将值数组与键名数组合在一起:
def convolve(headers):
. as $in
| reduce range(0; length) as $i ({}; . + {(headers[$i]): $in[$i]} );
定义convolve/1
后,我们现在可以创建对象数组:
.headers as $h | .rows | map( convolve($h) )
将上述jq程序放在一个文件(比如program.jq)中,将JSON放在一个名为input.json的文件中,调用:
jq -f program.jq input.json
产生
[
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
]
以下是convolve
的无减少定义;它假设transpose/0
的可用性,它包含在jq 1.5及以上版本中:
def convolve(headers):
[., headers] | transpose | map( {(.[0]): .[1]} ) | add;
以下代码段在功能上与上面显示的内容相同:
.headers as $h
| reduce .rows[] as $row ([]; . + [$row|convolve($h)])
答案 1 :(得分:0)
这是一个使用递归函数 obj 从键和值数组构建对象的解决方案。
def obj($keys; $values):
if $keys|length < 1
then {}
else {($keys[0]): $values[0]} + obj($keys[1:]; $values[1:])
end
;
[ obj(.headers; .rows[]) ]