我正在尝试使用以下格式的字符串创建json文件:
string="key1=value1,key2=value2"
是否有一种方法可以通过使用=
和,
符号作为键和值的分隔符来使用jq创建json?
我正在寻找的输出将是:
{"key1": "value1", "key2” :”value2"}
我尝试将这篇文章用作参考: Create JSON using jq from pipe-separated keys and values in bash-但是,它期望输入包含仅包含键的行,然后包含仅值的行;在这里,键和值都是散布的。
答案 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"}