我有一个脚本,我在其中存储变量并使用它尝试创建 json 输出到文件。这是我的 json 构建格式
#!/bin/bash
JSON_STRING=$(jq -n \
--arg configId "$configid" \
--arg objectname "tempfile" \
--arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
--arg test "2021" \
'$ARGS.named') > output.json
所需的 json o/p (output.json) -
{ "configId": "c8f", "objectname": "tempfile", "artifacts": [{ "name" : "oer", "version" : "1.01" }], "test" : "2021"}
这里我没有得到期望的输出。任何帮助都很好
答案1
我会分两步完成:(编辑:工件是一个对象数组)
inner=$(jq -n --arg name oer \
--arg version "$ot" \
'$ARGS.named'
)
final=$(jq -n --arg configId "$configid" \
--arg objectname "tempfile" \
--arg test "2021" \
--argjson artifacts "[$inner]" \
'$ARGS.named'
)
echo "$final"
{
"configId": "c8f",
"objectname": "tempfile",
"artifacts": [
{
"name": "oer",
"version": "1.01"
}
], "test": "2021"
}
-c
如果您希望最终输出为一行,请添加 a 。
答案2
在命令行上创建 JSON 的最安全方法是使用为您构建 JSON 的工具jq
。但是,由于您有一个嵌套结构,您可能希望在单独的调用中创建该子jq
结构由格伦·杰克曼饰演。
另一种方法可以实现他们所展示的功能,但一次完成:
jq -n \
--arg configId "$configid" \
--arg objectname tempfile \
--argjson artifacts "$(
jq -n \
--arg name oer \
--arg version "$ot" \
'$ARGS.named'
)" \
--arg test 2021 \
'$ARGS.named'
我们使用--argjson
而不是--arg
包含来自内部的 JSON 文档jq
,因为它是一个 JSON 文档而不是需要编码的字符串。
您也可以使用jo
,这可能会减少一点打字,
jo configId="$configid" \
objectname=tempfile \
artifacts="$( jo name=oer version="$ot" )" \
test=2021
该实用程序的描述 jo
可在此处找到:https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/
答案3
您没有获得输出,因为您将输出保存在变量中,因此没有任何内容可以重定向到文件。你可以这样做:
variable=$(command)
或这个:
command > file
但你不能这样做,variable=$(command) > file
因为没有什么可以重定向。因此,尽管上面的代码将运行并创建和/或覆盖file
,但该文件将始终为空,因为您已经将命令的输出保存在变量中。
因此,如果你们都想将输出保存在变量中并将其保存到文件中,则需要如下所示的内容:
JSON_STRING=$(jq -n \
--arg configId "$configid" \
--arg objectname "tempfile" \
--arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
--arg test "2021" \
'$ARGS.named')
printf '%s\n' "$JSON_STRING" > output.json
答案4
看来您希望artifacts
被视为 JSON 数组。如果是这种情况,请使用--argjson
代替--arg
并修复您的报价:
jq -n \
--arg configId "$configid" \
--arg objectname "tempfile" \
--argjson artifacts "[{ \"name\" : \"oer\", \"version\" : \"$ot\" }]" \
--arg test "2021" \
'$ARGS.named'
这应该导致:
{
"configId": "",
"objectname": "tempfile",
"artifacts": [
{
"name": "oer",
"version": "1.01"
}
],
"test": "2021"
}