首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将key = value对转换为JSON

将key = value对转换为JSON
EN

Stack Overflow用户
提问于 2020-05-14 10:10:59
回答 2查看 916关注 0票数 2

我正在尝试将包含key = value对的文件转换为JSON。此文件可能包含Windows (\r\n)和空行。

给定以下输入(请注意空行):

代码语言:javascript
复制
foo = aa
bar = bb

qux = cc
white space = white space
* = special-char

这是预期的结果:

代码语言:javascript
复制
{
  "foo": "aa",
  "bar": "bb",
  "qux": "cc",
  "white space": "white space",
  "*": "special-char"
}

我设法走了这么远:

代码语言:javascript
复制
{
  "foo": "aa"
}
{
  "bar": "bb"
}
{
  "qux": "cc"
}
{
  "white space": "white space"
}
{
  "*": "special-char"
}

使用以下命令:

代码语言:javascript
复制
 jq --raw-input 'split("\n") | map(split(" = ") | { (.[0]): .[1] }) | .[]' 

但我找不出缺失的地方。缺少的是什么,还是这是实现这一目标的更好方法?

编辑:添加了对空行和Windows的约束

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-14 10:16:03

你们真的很亲密。将\r放在末尾,由=拆分,将结果数组转换为对象,将它们放入数组并传递给add

代码语言:javascript
复制
[ inputs
  | gsub("\r$"; "")
  | split(" = "; "")
  | select(length == 2)
  | {(.[0]): .[1]}
] | add

您需要在命令行上指定--raw-input/-R--null-input/-n选项,这样才能工作。

票数 3
EN

Stack Overflow用户

发布于 2020-05-14 22:00:07

如果其中一个“值”包含"=“,那么使用split("=")天真地会产生不正确的结果。如果您的jq支持capture,那么这里有一个解决方案可以避免这个问题:

代码语言:javascript
复制
jq -nR '
  def trim: sub("^ +";"") | sub(" +$";"");
  [inputs
   | select(index("="))
   | sub("\r$"; "")
   | capture( "(?<key>[^=]*)=(?<value>.*)" )
   | ( (.key |= trim) | (.value |= trim)) ]
  | from_entries'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61794706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档