【问题标题】:Convert JSON to String surrounded by Single Quotes Bash / JQ将 JSON 转换为由单引号 Bash / JQ 包围的字符串
【发布时间】:2022-08-02 17:45:52
【问题描述】:

我有一个有效的 JSON 值,它是从字符串中使用 JQ 生成的,

# key1:value1,key2:value2 --> {\"key1\":\"value1\",\"key2\":\"value2\"}
input=\'key1:value1,key2:value2\'
json=$( jq -Rc \'split(\",\") | map( split(\":\") | {(.[0]): .[1]}) add |\' <<<\"$input\" )
echo $json

这工作得很好,但现在我想将 json 转换为字符串而不转义每个键和值的双引号,只需要在末尾添加单引号。

# {\"key1\":\"value1\",\"key2\":\"value2\"} --->  \'{\"key1\":\"value1\",\"key2\":\"value2\"}\'

我尝试了 tostring 函数,但它转义了所有双引号

strJson=$(jq tostring <<< \"$json\")
echo $strJson
  • print -v quoted \"\'%s\'\" \"$json\"; echo \"$quoted\"
  • @Inian 我在 Azure Pipeline shell 中运行它,它说“无法初始化设备 PRN”。
  • 顺便说一句,echo $anything 有问题;它应该始终是echo \"$anything\"。见I just assigned a variable but echo $variable shows something else!
  • 顺便说一句——“用单引号括起来”的具体上下文是什么?通常单引号对于字面值是正确的,但对于存储在变量中的值是错误的。例如,写 json=\'{\"foo\": \"bar\"}\'` 是正确的,但这些引号实际上并不是您存储值的一部分;相反,它们是关于如何解析该值的指令。
  • @CharlesDuffy 我必须通过 cli 的 \'--set-string\' 标志将此 JSON 作为字符串传递给 Helm 图表。因此,用户将在管道参数中输入键、值对的上下文将被转换为 JSON,然后作为字符串传递,而不会将双引号转义到 helm 图表。 Helm 图表本身在处理变量的 JSON 值方面非常糟糕,它们将在即将发布的版本中引入一个 --set-json 标志,这将更加方便

标签: json string bash jq


【解决方案1】:

添加@json 将结果编码为JSON,然后添加@sh 以转义字符串以实现Shell 兼容性,并将-c 选项替换为-r 以获得原始输出:

jq -Rr 'split(",") | map( split(":") | {(.[0]): .[1]}) | add | @json | @sh' <<<"$input"
'{"key1":"value1","key2":"value2"}'

Demo


附录:此解决方案遵循将 JSON 文档包装在单引号中而不转义内部双引号的明确要求。但是,由于不清楚/不清楚结果数据是什么或如何使用的,为了更清楚地了解其中的ongoing discussion,将纯 JSON 结果存储在 shell 变量中并将其用作另一个程序的参数可能以及OP试图实现的目标:

#!/bin/bash

input='key1:value1,key2:value2'
json="$(jq -Rc 'split(",") | map( split(":") | {(.[0]): .[1]}) | add' <<<"$input")"

program --set-argument "$json"

【讨论】:

  • @sh 适用于由外壳程序 evaled 的值;这不是这里的情况。
  • @CharlesDuffy 它可能这里不是这样。但据我了解,OP 根本没有详细说明所需格式的用途,因此我认为@sh 对于一般/未知情况可能比简单地用@json "'\''\(.)'\''" 引用 JSON 结果更可靠。
  • 请参阅有关问题的 cmets。 OP 显然正在尝试替换使用 --set-json '{"json-value": "goes-here"}' 的 shell 命令行;但那些单引号是句法,而不是文字。
猜你喜欢
  • 2021-08-16
  • 2020-01-03
  • 1970-01-01
  • 2019-04-07
  • 2016-03-24
  • 1970-01-01
  • 2012-05-30
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多