【问题标题】:Create JSON from string with format "key1=value1,key2=value2" using jq使用 jq 从格式为“key1=value1,key2=value2”的字符串创建 JSON
【发布时间】:2019-01-18 12:04:28
【问题描述】:

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

string="key1=value1,key2=value2"

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

我正在寻找的输出是:

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

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

【问题讨论】:

标签: json bash csv parsing jq


【解决方案1】:

这是一个无 reduce 的解决方案,它假定 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"
}

【讨论】:

  • 感谢您的回答!我想知道是否可以更改您使用 split 的方式以处理其值以逗号分隔的多值键?我已经编辑了我的原始问题,以举例说明我的意思。似乎当前解决方案将第二个值解析为键值对本身。
  • 以后,如果你有一个新问题,问一个新的 SO 问题可能对每个人都是最好的。
  • @peak, ...在这一点上,我认为我们应该迫切提出一个新问题,而不是奖励变色龙问题;这当然是关于元的共识。
【解决方案2】:
string="key1=value1,key2=value2"

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

【讨论】:

    【解决方案3】:
    echo -n "key1=value1,key2=value2" | \
    jq -csR '[split(",")[]|split("=") | {(.[0]): .[1]}]|add'
    

    这给了

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

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多