我正在使用jq,正在尝试将新的JSON对象添加到现有文件的新密钥中。
我有以下JSON文件 foobarbaz.json :
{
"example":{
"name": "stackOverflowQuestion"
}
}
我想在示例下添加一个新条目,以便在 foobar.json
中获得以下输出{
"example": {
"name": "stackOverflowQuestion",
"new": {
"newfield": {
"key": "value"
}
}
}
}
我在终端中使用以下命令:
$ tempvar='{"newfield":{"key":"value"}}'
$ cat foobarbaz.json | jq '.example.new=env.tempvar' > foobar.json
但是, foobar.json 中的输出有些出乎意料:
{
"example": {
"name": "stackOverflowQuestion",
"new": "{\"newfield\":{\"key\":\"value\"}}"
}
}
为什么jq用大括号将大括号括起来,为什么它会转义双引号呢?
答案 0 :(得分:3)
通过将其解码为JSON内容,使用fromjson
将字符串(格式为 all 的环境变量都在其中!)转换为相应的数据结构。
tempvar='{"newfield":{"key":"value"}}' jq '.example.new=(env.tempvar | fromjson)' <<'EOF'
{
"example":{
"name": "stackOverflowQuestion"
}
}
EOF
...作为输出发出:
{
"example": {
"name": "stackOverflowQuestion",
"new": {
"newfield": {
"key": "value"
}
}
}
}
答案 1 :(得分:2)
使用my_report2 <- function(x) {
Report <- df %>%
filter(Agents == x) %>%
group_by(Month) %>%
summarise(Skill = mean(Score1), Attitude = mean(Score2))
}
map(df$Agents %>% unique, my_report2)
选项将预先存在的JSON代码段作为变量传递给过滤器。
--argjson
请注意,$ jq --argjson x "$tempvar" '.example.new=$x' foobarbaz.json
{
"example": {
"name": "stackOverflowQuestion",
"new": {
"newfield": {
"key": "value"
}
}
}
}
不是严格必需的,如果仅将其定义为与过滤器配合使用,则可以将其删除:
tempvar
答案 2 :(得分:0)
作为一种替代性方法,有一种基于JSON的步行路径Unix工具, jtc
:
bash $ tempvar='{"newfield":{"key":"value"}}'
bash $ <foobarbaz.json jtc -w'[example]' -i"$tempvar" -T'{"new": {{}}}'
{
"example": {
"name": "stackOverflowQuestion",
"new": {
"newfield": {
"key": "value"
}
}
}
}
bash $
-i
是example
,然后对插入的JSON值进行模板插值(-T
)以添加带有标签的封装new
。 PS>披露:我是jtc
-用于JSON操作的shell cli工具的创建者