jq:将嵌套对象添加到 JSON
jq: adding nested object to a JSON
我有一个包含多个配置文件的 json 文件:
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
}
}
我想用jq再插入一个配置文件,"test",这样最后的结果就是
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
},
"test": {
"user": "user3",
"channel": "channel3",
"hook": "hook3"
}
}
我可以直接在命令行中使用:
cat filename |
jq '.+ { "test": { "user": "u3", "channel" : "c3", "hook": "w3" } }'
但是当我在 bash 脚本中尝试时:
cat "$CONF_FILE" |
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'.+ { $p: { "user": $u, "channel": $c, "hook": $w } }' `
我收到以下错误:
jq: error: syntax error, unexpected ':', expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
.+ { $p: { "user": $u, "channel": $c, "hook": $w } }
jq: error: syntax error, unexpected '}', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.+ { $p: { "user": $u, "channel": $c, "hook": $w } }
jq: 2 compile errors
我试过用引号将变量括起来,但我得到的只是字符串 $p:
cat "$CONF_FILE" |
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'.+ { "$p": { "user": $u, "channel": $c, "hook": $w } }'
结果:
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
},
"$p": {
"user": "user3",
"channel": "channel3",
"hook": "hook3"
}
}
编辑: 我找到了一个临时解决方案,将对象转换为数组,编辑值(现在配置文件名称是值而不是键)和将数组转换回对象:
cat "$CONF_FILE" |
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'to_entries | .+ [ { "key": $p, "value": { "user": $u, "channel": $c, "hook": $w } } ] | from_entries'
这看起来很粗糙,但它确实有效。我仍然希望有更好的解决方案...
在动态键周围使用括号:
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'. + {($p): {"user": $u, "channel": $c, "hook": $w}}' "$CONF_FILE"
这是一个脚本,演示了使用 env 访问通过环境传递的变量的解决方案:
#!/bin/bash
CONF_FILE=data.json
export P=test
export U=user3
export C=channel3
export W=hook3
jq '
.[env.P] = {
user: env.U,
channel: env.C,
hook: env.W
}
' "$CONF_FILE"
如果 data.json
包含示例数据,此脚本应生成输出
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
},
"test": {
"user": "user3",
"channel": "channel3",
"hook": "hook3"
}
}
我有一个包含多个配置文件的 json 文件:
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
}
}
我想用jq再插入一个配置文件,"test",这样最后的结果就是
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
},
"test": {
"user": "user3",
"channel": "channel3",
"hook": "hook3"
}
}
我可以直接在命令行中使用:
cat filename |
jq '.+ { "test": { "user": "u3", "channel" : "c3", "hook": "w3" } }'
但是当我在 bash 脚本中尝试时:
cat "$CONF_FILE" |
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'.+ { $p: { "user": $u, "channel": $c, "hook": $w } }' `
我收到以下错误:
jq: error: syntax error, unexpected ':', expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
.+ { $p: { "user": $u, "channel": $c, "hook": $w } }
jq: error: syntax error, unexpected '}', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.+ { $p: { "user": $u, "channel": $c, "hook": $w } }
jq: 2 compile errors
我试过用引号将变量括起来,但我得到的只是字符串 $p:
cat "$CONF_FILE" |
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'.+ { "$p": { "user": $u, "channel": $c, "hook": $w } }'
结果:
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
},
"$p": {
"user": "user3",
"channel": "channel3",
"hook": "hook3"
}
}
编辑: 我找到了一个临时解决方案,将对象转换为数组,编辑值(现在配置文件名称是值而不是键)和将数组转换回对象:
cat "$CONF_FILE" |
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'to_entries | .+ [ { "key": $p, "value": { "user": $u, "channel": $c, "hook": $w } } ] | from_entries'
这看起来很粗糙,但它确实有效。我仍然希望有更好的解决方案...
在动态键周围使用括号:
jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'. + {($p): {"user": $u, "channel": $c, "hook": $w}}' "$CONF_FILE"
这是一个脚本,演示了使用 env 访问通过环境传递的变量的解决方案:
#!/bin/bash
CONF_FILE=data.json
export P=test
export U=user3
export C=channel3
export W=hook3
jq '
.[env.P] = {
user: env.U,
channel: env.C,
hook: env.W
}
' "$CONF_FILE"
如果 data.json
包含示例数据,此脚本应生成输出
{
"profile1": {
"user": "user1",
"channel": "channel1",
"hook": "hook1"
},
"default": {
"user": "user1",
"channel": "channel1",
"hook": "hook2"
},
"test": {
"user": "user3",
"channel": "channel3",
"hook": "hook3"
}
}