如果为真,则对 JSON 文档使用 -match 以获得 return 不同的结果

Use -match on JSON document to return different result if true

如果 $json -Match returns 为真,相对于指定 -Match 值所在的范围,返回在 servers|addresses|addr 中找到的第一个值的最佳方式是什么找到了吗?

例如,使用下面的 $json 变量:

If $json -Match "Aboubacar" returns true, then $result = "143.179.56.126"
If $json -Match "Tendaji" returns true, then $result = "113.55.212.113"

我想在 Powershell 版本 2 中完成此操作。

$json='
{
    "servers": [
        {
            "addresses": {
                "": [
                    {
                        "addr": "113.55.212.113",
                        "OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
                        "OS-EXT-IPS:type": "fixed",
                        "version": 4
                    }
                ]
            },
            "created": "2013-08-15T12:04:04Z",
            "flavor": {
                "id": "1",
                "links": [
                    {
                        "href": "http://openstack.example.com/flavors/1",
                        "rel": "bookmark"
                    }
                ]
            },
            "hostId": "117535ce0eda7ee02ebffe2c976173629385481ae3f2bded5e14a66b",
            "id": "ae114799-9164-48f5-a036-6ef9310acbc4",
            "image": {
                "id": "70a599e0-31e7-49b7-b260-868f441e862b",
                "links": [
                    {
                        "href": "http://openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b",
                        "rel": "bookmark"
                    }
                ]
            },
            "key_name": null,
            "links": [
                {
                    "href": "http://openstack.example.com/v2.1/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "self"
                },
                {
                    "href": "http://openstack.example.com/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "bookmark"
                }
            ],
            "metadata": {
                "My Server Name": "Tendaji"
            },
            "name": "Tendaji"
        },
        {
            "addresses": {
                "": [
                    {
                        "addr": "143.179.56.126",
                        "OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
                        "OS-EXT-IPS:type": "fixed",
                        "version": 4
                    }
                ]
            },
            "created": "2013-08-15T12:04:04Z",
            "flavor": {
                "id": "1",
                "links": [
                    {
                        "href": "http://openstack.example.com/flavors/1",
                        "rel": "bookmark"
                    }
                ]
            },
            "hostId": "117535ce0eda7ee02ebffe2c976173629385481ae3f2bded5e14a66b",
            "id": "ae114799-9164-48f5-a036-6ef9310acbc4",
            "image": {
                "id": "70a599e0-31e7-49b7-b260-868f441e862b",
                "links": [
                    {
                        "href": "http://openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b",
                        "rel": "bookmark"
                    }
                ]
            },
            "key_name": null,
            "links": [
                {
                    "href": "http://openstack.example.com/v2.1/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "self"
                },
                {
                    "href": "http://openstack.example.com/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "bookmark"
                }
            ],
            "metadata": {
                "My Server Name": "Aboubacar"
            },
            "name": "Aboubacar"
        }
    ]
}'

$json -Match "Aboubacar"  # if true return true, then $result = "143.179.56.126" as seen in `servers|addresses|addr`
$json -Match "Tendaji" # true, then $result = "113.55.212.113" as seen in `servers|addresses|addr`

最简单的方法是将 JSON 字符串转换为对象,然后使用 PowerShell 中的简单对象选择功能。但是,此方法需要 'adresses' 下的非空白 属性 名称。

大概是这样:

$json='
{
    "servers": [
        {
            "addresses": {
                "addr": [
                    {
                        "addr": "113.55.212.113",
                        "OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
                        "OS-EXT-IPS:type": "fixed",
                        "version": 4
                    }
                ]
            },
            "created": "2013-08-15T12:04:04Z",
            "flavor": {
                "id": "1",
                "links": [
                    {
                        "href": "http://openstack.example.com/flavors/1",
                        "rel": "bookmark"
                    }
                ]
            },
            "hostId": "117535ce0eda7ee02ebffe2c976173629385481ae3f2bded5e14a66b",
            "id": "ae114799-9164-48f5-a036-6ef9310acbc4",
            "image": {
                "id": "70a599e0-31e7-49b7-b260-868f441e862b",
                "links": [
                    {
                        "href": "http://openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b",
                        "rel": "bookmark"
                    }
                ]
            },
            "key_name": null,
            "links": [
                {
                    "href": "http://openstack.example.com/v2.1/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "self"
                },
                {
                    "href": "http://openstack.example.com/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "bookmark"
                }
            ],
            "metadata": {
                "My Server Name": "Tendaji"
            },
            "name": "Tendaji"
        },
        {
            "addresses": {
                "addr": [
                    {
                        "addr": "143.179.56.126",
                        "OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
                        "OS-EXT-IPS:type": "fixed",
                        "version": 4
                    }
                ]
            },
            "created": "2013-08-15T12:04:04Z",
            "flavor": {
                "id": "1",
                "links": [
                    {
                        "href": "http://openstack.example.com/flavors/1",
                        "rel": "bookmark"
                    }
                ]
            },
            "hostId": "117535ce0eda7ee02ebffe2c976173629385481ae3f2bded5e14a66b",
            "id": "ae114799-9164-48f5-a036-6ef9310acbc4",
            "image": {
                "id": "70a599e0-31e7-49b7-b260-868f441e862b",
                "links": [
                    {
                        "href": "http://openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b",
                        "rel": "bookmark"
                    }
                ]
            },
            "key_name": null,
            "links": [
                {
                    "href": "http://openstack.example.com/v2.1/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "self"
                },
                {
                    "href": "http://openstack.example.com/servers/ae114799-9164-48f5-a036-6ef9310acbc4",
                    "rel": "bookmark"
                }
            ],
            "metadata": {
                "My Server Name": "Aboubacar"
            },
            "name": "Aboubacar"
        }
    ]
}'

[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
$ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$jsonObj = $ser.DeserializeObject($json)

$jsonObj.servers | Where-Object {$_.name -EQ 'Tendaji'} | `
  select-object { $_.addresses.addr[0].addr }

$jsonObj.servers | Where-Object {$_.name -EQ 'Aboubacar'} | `
  select-object { $_.addresses.addr[0].addr }