json - 使用 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 - 但是,它期望输入包含仅包含键的行,然后是仅包含值的后续行;在这里,键和值都是穿插的。
解决方案
这是一个无需减少的解决方案,假设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"
}
推荐阅读
- node.js - 如何使用猫鼬模式存储数据以使用嵌套对象?
- c++ - 如何将“void(Args args)”转换为“std::function
" - java - 运行编译的 scala 3 代码给出 java.lang.NoClassDefFoundError: scala/util/CommandLineParser$ParseError
- java - Connection.rollback() 在 Java 中不起作用
- databricks - Delta Lake 存储层 - 概念
- caching - 通过增加数组的大小来减少缓存未命中 - 为什么这样做?
- c# - 可以从任务中调用相同的任务吗?
- python - Flask 背靠背渲染两个模板
- android - 如何在jetpack compose中显示已安装的应用程序图标
- c# - 从 CLI 运行 dotnet test 时,如何查看控制台输出的 gitlab 级别