使用jq将数组中的奇数索引转换为json中的键值对

时间:2018-02-14 16:39:56

标签: json parsing jq

我尝试使用jq将Solr 6.5指标解析为键值对:

{
"responseHeader": {
"status": 0,
"QTime": 7962
},
"metrics": [
"solr.core.shard1",
"QUERY./select",
"solr.core.shard2",
"QUERY./update"
...
]
}

我想在metrics数组中挑选奇数条目,并将它们组合成一个对象作为键值对,如下所示:

{ 
   "solr.core.shard1": "QUERY./select",
   "solr.core.shard2": "QUERY./update",
   ...
}

直到现在,我才能想出:

.metrics | to_entries | .[] | {(select(.key % 2 == 0).value): select(.key % 2 == 1).value}

但这会返回错误或没有结果。

如果有人能指出我正确的方向,我将不胜感激。我觉得答案可能就在地图操作员身上,但我还没能弄明白。

2 个答案:

答案 0 :(得分:2)

jq 解决方案:

jq '[ .metrics as $m | range(0; $m | length; 2) 
      | {($m[.]): $m[(. + 1)]} ] | add' jsonfile

输出:

{
  "solr.core.shard1": "QUERY./select",
  "solr.core.shard2": "QUERY./update"
}

https://stedolan.github.io/jq/manual/v1.5/#range(upto),range(from;upto)range(from;upto;by)

答案 1 :(得分:1)

这是一个辅助功能,使解决方案变得微不足道:

# Emit a stream consisting of pairs of items taken from `stream`
def pairwise(stream):
  foreach stream as $i ([]; 
      if length == 1 then . + [$i] else [$i] end;
      select(length == 2));

从这里有几个不错的选择,例如我们可以从:

开始
.metrics
| [pairwise(.[]) | {(.[0]): .[1]}]
| add

根据您的输入,这会产生:

{
  "solr.core.shard1": "QUERY./select",
  "solr.core.shard2": "QUERY./update"
}

所以你可能想写:

 .metrics |= ([pairwise(.[]) | {(.[0]): .[1]}] | add)