jq:如何通过从另一个对象读取的名称查找JSON对象?

时间:2019-06-02 10:22:04

标签: json bash jq

我有以下JSON:

{
    "contexts": {
        "context1": {
            "mydata": "value1"
        },
        "context2": {
            "mydata": "value2"
        }
    },
    "current_context": "context2"
}

我想使用jqmydata所指示的上下文输出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来做到这一点?

谢谢!

2 个答案:

答案 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工具的创建者