使用jq将标题列表和值列表转换为有效的json

时间:2018-11-19 21:47:16

标签: json jq

我正在使用这样的端点:

curl -S www.example.com 
[[\"A", "B", "C", "D"]\n
["1","2",null,"4"]]

我想使用jq将此响应更改为适当的json,而不是标题列表和与列表中的项目对应的一行数据:

{"A": "1", "B": "2", "C" : null, "D": "4"}

但是,here的显而易见答案

curl -S www.example.com  | jq '{(.[0]) : .[1] }'

产生

jq: error (at <stdin>:1): Cannot use array (["A...) as object key

还有

curl -S www.example.com  | jq '{.[0] : .[1] }'

产生

jq: error: syntax error, unexpected '.' (Unix shell quoting issues?) at <top-level>, line 1:
{.[0] : .[1] } 
jq: 1 compile error

什么是正确的语法

[[HEADER1,HEADER2,...]\n
[DATA1,DATA2]] 

响应到json吗?

未引用的null和换行符是我的问题的根源吗?

1 个答案:

答案 0 :(得分:1)

根据发布的内容,curl命令的输出太奇怪了,需要进行特殊处理。可能是输出不像所示的那样怪异,并且作为下面解决方案一部分显示的sed命令可能需要调整。

无论如何,输入如下所示:

sed 's/\\"/"/;1s/\\n/,/' input.txt | jq '
  .[0] as $h
  | .[1] 
  | . as $in
  | reduce range(0;length) as $i
      ({}; .[$h[$i]] = $in[$i])'

产生所需的输出。

一站式购物

jq -Rs < input.txt '
  split("\n")
  | map(select(length>0))
  | ( .[0] | sub("[[]\\\\"; "") | sub("\\\\n"; "") | fromjson) as $h
  | .[1]
  | sub("\\]\\]"; "]")
  | fromjson
  | . as $in
  | reduce range(0;length) as $i
      ({}; .[$h[$i]] = $in[$i])'