代码之家  ›  专栏  ›  技术社区  ›  Brian

如何使用jq获取json数组中“@name”为“dbUrl”的“@value”值?

  •  1
  • Brian  · 技术社区  · 6 年前

    以下 test.json 文件从xml文件转换为 xq :

    {
      "project": {
        "@basedir": ".",
        "property": [
          {
            "@environment": "env"
          },
          {
            "@name": "foo",
            "@value": "bar"
          },
          {
            "@name": "aaa",
            "@value": "bbb"
          },
          {
            "@name": "dbUrl",
            "@value": "123.123.123.123"
          }
        ]
      }
    }
    

    我怎么能得到 123.123.123.123 使用 dbUrl 具有 jq ?

    请不要叫我用 jq '.project.property[3]["@value"]' test.json 得到 123.123.123.123号 .

    因为 {"@name": "dbUrl", "@value": "123.123.123.123"} 不能保证出现在 property .

    例如:

    {
      "project": {
        "@basedir": ".",
        "property": [
          {
            "@environment": "env"
          },
          {
            "@name": "foo",
            "@value": "bar"
          },
          {
            "@name": "dbUrl",
            "@value": "123.123.123.123"
          },
          {
            "@name": "aaa",
            "@value": "bbb"
          }
        ]
      }
    }
    

    在这种情况下, jq'.project.property[3][“@value”]'测试.json 不回来了 123.123.123.123号 . 它又回来了 bbb .

    2 回复  |  直到 6 年前
        1
  •  2
  •   Inian    6 年前

    您不需要查看特定索引,只需使用 select() 表达式为您执行此操作,它将返回 @name 包含 dbUrl 把它还给 @value

    jq --raw-output '.project.property[] | select(."@name"=="dbUrl") | ."@value"'
    

    从田野开始 @姓名 @价值 有特殊的性格 @ 现在,您需要在引号中访问它们。

    jqplay - URL

        2
  •  0
  •   peak    6 年前

    如果您希望“@value”对应的所有值都是“dbUrl”:

    .. | objects | select(.["@name"] == "dbUrl") | .["@value"]
    

    在这里我用了 .["KEYNAME"] 用于访问与“KEYNAME”对应的值的窗体,因为它比 .KEYNAME .