我有以下JSON:
{
"contexts": {
"context1": {
"mydata": "value1"
},
"context2": {
"mydata": "value2"
}
},
"current_context": "context2"
}
我想使用jq
为mydata
所指示的上下文输出current_context
的值。上面将输出value2
。如果将JSON更改为"current_context": "context1"
,我将得到value1
。
给出两次调用jq和上面的JSON内容到名为jq.json
的文件中,此方法有效:
jq -r --arg context "$(jq -r '.current_context' jq.json)" '.contexts | to_entries[] | select(.key == $context) | .value.mydata' jq.json
是否可以通过一次调用jq来做到这一点?
谢谢!
答案 0 :(得分:2)
赞:
jq -r '.current_context as $cc|.contexts[$cc].mydata' file.json
您还可以使用变量:
#include <stdio.h>
int foo(int x, int y)
{
printf("x = %d y = %d\n", x, y);
return x + y;
}
int main()
{
printf("Hello World");
int *x = (int[]){foo(1,2), foo(4,5), foo(5,6)};
int y[] = {foo(1,2), foo(4,5), foo(5,6)};
return 0;
}
答案 1 :(得分:2)
这是jq解决方案的替代方法,它基于步行路径Unix实用程序 jtc
:
bash $ jtc -w'[current_context]<cc>v[^0]<cc>t[mydata]' file.json
"value2"
bash $
步行路径(-w
)细分:
[current_context]<cc>v
-进入current_context
值并将其存储在命名空间cc
中(指令<cc>v
做到了)[^0]<cc>t[mydata]
-将步行路径重置为根([^0]
),并递归搜索存储在名称空间(<cc>t
)中的标签(标签),然后按标签找到找到的JSON对象mydata
。 PS>披露:我是jtc
-用于JSON操作的shell cli工具的创建者