使用值映射标头

时间:2017-04-21 14:53:22

标签: json jq

我有一种“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"
  ]

2 个答案:

答案 0 :(得分:0)

  1. 给定输入中有一个多余的逗号。以下假定它已被删除。
  2. 请求的输出无效JSON,因此以下假设输出是一个对象数组(如下所示)。其他输出格式当然也是可能的,包括原始发布中给出的格式。
  3. 以下使用了jq的“map”和“reduce”过滤器;如果您不熟悉其中任何一个,请查阅jq文档。

  4. 为清楚起见,以下解决方案使用辅助函数将值数组与键名数组合在一起:

    def convolve(headers):
      . as $in
      | reduce range(0; length) as $i ({}; . + {(headers[$i]): $in[$i]} );
    
  5. 定义convolve/1后,我们现在可以创建对象数组:

    .headers as $h | .rows | map( convolve($h) )
    
  6. 将上述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"
      }
    ]
    
  7. 以下是convolve的无减少定义;它假设transpose/0的可用性,它包含在jq 1.5及以上版本中:

    def convolve(headers):
      [., headers] | transpose | map( {(.[0]): .[1]} ) | add;
    
  8. 以下代码段在功能上与上面显示的内容相同:

    .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[]) ]