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

时间:2018-07-25 09:58:14

标签: json jq

以下test.json文件是使用xq从xml文件转换而成的:

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

如何将123.123.123.123jq一起使用,dbUrl

请不要告诉我使用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"]' test.json不返回123.123.123.123。它返回bbb

2 个答案:

答案 0 :(得分:2)

您无需查看特定的索引,只需使用select()表达式为您完成操作,这将返回包含@name的{​​{1}}并返回其{{1 }}

dbUrl

由于字段@valuejq --raw-output '.project.property[] | select(."@name"=="dbUrl") | ."@value"' 带有特殊字符@name,因此您需要在引号内对其进行访问。

jqplay - URL

答案 1 :(得分:0)

如果要将与“ @name”对应的所有“ @value”值都设为“ dbUrl”:

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

在这里,我使用.["KEYNAME"]表单来访问与“ KEYNAME”相对应的值,因为它比.KEYNAME更可靠。