使用jq

时间:2018-08-10 20:46:03

标签: json bash csv parsing jq

我正在尝试使用以下格式的字符串创建json文件:

string="key1=value1,key2=value2"

是否有一种方法可以通过使用=,符号作为键和值的分隔符来使用jq创建json?

我正在寻找的输出将是:

{"key1": "value1", "key2” :”value2"}

我尝试将这篇文章用作参考: Create JSON using jq from pipe-separated keys and values in bash-但是,它期望输入包含仅包含键的行,然后包含仅值的行;在这里,键和值都是散布的。

3 个答案:

答案 0 :(得分:4)

这是一个简化的解决方案,假定string是shell变量(不是要分析的字符串的一部分),并且可以通过首先在“,”上拆分来完成字符串的解析:

jq -R 'split(",")
       | map( index("=") as $i | {(.[0:$i]) : .[$i+1:]})
       | add' <<< "$string"

请注意,这允许“ =”出现在值中。

这里唯一的棘手之处在于,当以编程方式指定键名时,必须将其括在括号内。

补充问题

  

string =“ key1 = value1 | key2 = value2,value3 | key3 = value4”

在这种情况下,您将首先分割“ |”,然后找到首次出现的“ =“:

split("|")
| map( index("=") as $i | {(.[0:$i]) : .[$i+1:]})
| add
| map_values(if index(",") then split(",") else . end)

输出:

{
  "key1": "value1",
  "key2": [
    "value2",
    "value3"
  ],
  "key3": "value4"
}

答案 1 :(得分:2)

string="key1=value1,key2=value2"

jq -Rc '
split(",")
| [.[] | match( "([^=]*)=(.*)" )]
| reduce .[].captures as $item ({}; .[$item[0].string]=$item[1].string)
' <<<"$string"

答案 2 :(得分:0)

echo -n "key1=value1,key2=value2" | \
jq -csR '[split(",")[]|split("=") | {(.[0]): .[1]}]|add'

这给

{"key1":"value1","key2":"value2"}