Доступ к данным в JSON из Invoke-RestMethod - PullRequest
0 голосов
/ 04 октября 2018

Я получаю доступ к REST API из кластера Elasticsearch из Powershell.Вызов Get Get и получение данных не является проблемой.Обычно я могу получить нужные данные без проблем, но я борюсь с этим конкретным ответом.Я как-то все испортил.

Так что вызов - это вызов API, и у меня есть ответ в переменной ($ r).

При использовании Postman ответ JSON выглядит так (толькопервые два узла в показанном ответе. В реальном ответе есть 10 узлов):

{
    "_nodes": {
        "total": 10,
        "successful": 10,
        "failed": 0
    },
    "cluster_name": "helios",
    "nodes": {
        "LvrIjMcFR1ahhFOnPl-gsQ": {
            "name": "log001",
            "transport_address": "172.16.1.36:9300",
            "host": "172.16.1.36",
            "ip": "172.16.1.36",
            "version": "6.2.4",
            "build_hash": "ccec39f",
            "total_indexing_buffer": 1601889894,
            "roles": [
                "master",
                "data",
                "ingest"
            ],
            "attributes": {
                "ml.machine_memory": "68718481408",
                "ml.max_open_jobs": "20",
                "box_type": "hot",
                "ml.enabled": "true"
            }
        },
        "yuW4R6yyRFKYdNDcrnEbXA": {
            "name": "log008",
            "transport_address": "172.16.1.63:9300",
            "host": "172.16.1.63",
            "ip": "172.16.1.63",
            "version": "6.2.4",
            "build_hash": "ccec39f",
            "total_indexing_buffer": 1603639705,
            "roles": [
                "data",
                "ingest"
            ],
            "attributes": {
                "ml.machine_memory": "68718481408",
                "ml.max_open_jobs": "20",
                "box_type": "warm",
                "ml.enabled": "true"
            }
        }
    }
}

Так что я могу использовать

$r.nodes

, чтобы получить узлы

LvrIjMcFR1ahhFOnPl-gsQ : @{name=log001; transport_address=172.16.1.36:9300; host=172.16.1.36; ip=172.16.1.36;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1601889894; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
6QHP2i8rTXyw_z2jKqXnaA : @{name=log004; transport_address=172.16.1.68:9300; host=172.16.1.68; ip=172.16.1.68;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
DAgkSb6gQQauZlMDaA-VCw : @{name=log002; transport_address=172.16.1.49:9300; host=172.16.1.49; ip=172.16.1.49;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1601889894; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
aVu1OKHoRSinIZ-Ggf1eFg : @{name=log010; transport_address=172.16.1.60:9300; host=172.16.1.60; ip=172.16.1.60;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
6i9_HsVjTH29r0_vnnIvHg : @{name=log006; transport_address=172.16.1.67:9300; host=172.16.1.67; ip=172.16.1.67;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
QN7vh_UZTg2lgMJ_bZOcFw : @{name=log003; transport_address=172.16.1.35:9300; host=172.16.1.35; ip=172.16.1.35;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1601889894; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
C6iDoIA7RkaM8-OXwG49TQ : @{name=log009; transport_address=172.16.1.62:9300; host=172.16.1.62; ip=172.16.1.62;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
gEJx2P5uRmClV7R_oOyo2w : @{name=log005; transport_address=172.16.1.73:9300; host=172.16.1.73; ip=172.16.1.73;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
yuW4R6yyRFKYdNDcrnEbXA : @{name=log008; transport_address=172.16.1.63:9300; host=172.16.1.63; ip=172.16.1.63;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}
HLQquAaoQaedjtwvATf2cg : @{name=log007; transport_address=172.16.1.69:9300; host=172.16.1.69; ip=172.16.1.69;
                         version=6.2.4; build_hash=ccec39f; total_indexing_buffer=1603639705; roles=System.Object[];
                         attributes=; settings=; os=; process=; jvm=; thread_pool=; transport=; http=;
                         plugins=System.Object[]; modules=System.Object[]; ingest=}

Затем я ожидал сделать

$r.nodes[0]

, чтобы получить первый узел, но это дает мне то же самое, что и $ r.nodes ранее.

$r.nodes."LvrIjMcFR1ahhFOnPl-gsQ"

затем дает мнеИнформация, которая мне нужна об этом узле:

name                  : log001
transport_address     : 172.16.1.36:9300
host                  : 172.16.1.36
ip                    : 172.16.1.36
version               : 6.2.4
build_hash            : ccec39f
total_indexing_buffer : 1601889894
roles                 : {master, data, ingest}
attributes            : @{ml.machine_memory=68718481408; ml.max_open_jobs=20; box_type=hot; ml.enabled=true}

Но как мне получить какой-то итератор для узлов, поскольку я заранее не знаю ID узлов?

Я используюPowershell 5.1

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете использовать свойство PSObject, чтобы разбить объект.Тогда труба, пока вы не получите значение

$II = @"
{
    "_nodes": {
        "total": 10,
        "successful": 10,
        "failed": 0
    },
    "cluster_name": "helios",
    "nodes": {
        "LvrIjMcFR1ahhFOnPl-gsQ": {
            "name": "log001",
            "transport_address": "172.16.1.36:9300",
            "host": "172.16.1.36",
            "ip": "172.16.1.36",
            "version": "6.2.4",
            "build_hash": "ccec39f",
            "total_indexing_buffer": 1601889894,
            "roles": [
                "master",
                "data",
                "ingest"
            ],
            "attributes": {
                "ml.machine_memory": "68718481408",
                "ml.max_open_jobs": "20",
                "box_type": "hot",
                "ml.enabled": "true"
            }
        },
        "yuW4R6yyRFKYdNDcrnEbXA": {
            "name": "log008",
            "transport_address": "172.16.1.63:9300",
            "host": "172.16.1.63",
            "ip": "172.16.1.63",
            "version": "6.2.4",
            "build_hash": "ccec39f",
            "total_indexing_buffer": 1603639705,
            "roles": [
                "data",
                "ingest"
            ],
            "attributes": {
                "ml.machine_memory": "68718481408",
                "ml.max_open_jobs": "20",
                "box_type": "warm",
                "ml.enabled": "true"
            }
        }
    }
}
"@ | ConvertFrom-Json

$II.nodes.PSobject.Properties | %{
    $_.Value
}
0 голосов
/ 04 октября 2018

Проблема здесь в том, что json преобразуется в PSCustomObject.Вероятно, самый простой способ перечислить ключи - это сделать что-то вроде:

$NodeNames = $r.Nodes | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name
foreach ($NodeName in $NodeNames) {
    $r.Nodes.$Nodename
}

Если бы вы использовали PowerShell Core 6.1, вы могли бы также сделать что-то вроде:

$r = (Invoke-WebRequest 'http://url').Content | ConvertFrom-Json -AsHashTable

И затемВы можете перечислить через ключи с помощью:

foreach ($node in $r.Nodes.GetEnumerator()) {
    #code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...