首页 > 解决方案 > 使用 jq 从格式为“key1=value1,key2=value2”的字符串创建 JSON

问题描述

我正在尝试从具有以下格式的字符串创建一个 json 文件:

string="key1=value1,key2=value2"

=有没有办法通过指定和,符号作为键和值的分隔符来使用 jq 创建 json ?

我正在寻找的输出是:

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

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

标签: jsonbashcsvparsingjq

解决方案


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

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

推荐阅读