JmesPath-Ausdrücke imAWS SDK for PHPVersion 3 - AWS SDK for PHP

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

JmesPath-Ausdrücke imAWS SDK for PHPVersion 3

Mit JMESPath können Sie deklarativ festlegen, wie Elemente aus einem JSON-Dokument extrahiert werden sollen. DieAWS SDK for PHPist abhängig vonjmespath.phpum einige der High-Level-Abstraktionen wiePaginators in derAWS SDK for PHPVersion 3undWaiter-ObjektenAWS SDK for PHPVersion 3, legt aber auch die Suche nach JMesPath offenAws\ResultInterfaceundAws\ResultPaginator.

Sie können mit JMESPath in Ihrem Browser herumspielen, indem Sie die Online-JMESPath Beispiele ausprobieren. In der JMESPath-Spezifikation können Sie mehr über die Sprache einschließlich der verfügbaren Ausdrücke und Funktionen erfahren.

DieAWS CLIunterstützt JMESPath. Ausdrücke, die Sie für die CLI-Ausgabe schreiben, sind zu 100 Prozent mit Ausdrücken kompatibel, die für die Datei AWS SDK for PHP geschrieben wurden.

Extrahieren von Daten aus Ergebnissen

Die Schnittstelle Aws\ResultInterface verfügt über eine search($expression)-Methode, die Daten aus einem Ergebnismodell extrahiert, das auf einem JMESPath-Ausdruck basiert. Die Verwendung von JMESPath-Ausdrücken zum Abfragen der Daten aus einem Ergebnisobjekt kann dazu beitragen, den bedingten Code zu entfernen und die extrahierten Daten präziser auszudrücken.

Zur Verdeutlichung der Funktionsweise beginnen wir mit der Standard-JSON-Ausgabe unten. Sie beschreibt zwei Amazon Elastic Block Store (Amazon EBS), die an separate Amazon EC2 EC2-Instances angefügt sind.

$result = $ec2Client->describeVolumes(); // Output the result data as JSON (just so we can clearly visualize it) echo json_encode($result->toArray(), JSON_PRETTY_PRINT);
{ "Volumes": [ { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }, { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-18T20:26:16.000Z", "InstanceId": "i-4b41a37c", "VolumeId": "vol-2e410a47", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-2e410a47", "State": "in-use", "SnapshotId": "snap-708e8348", "CreateTime": "2013-09-18T20:26:15.000Z", "Size": 8 } ], "@metadata": { "statusCode": 200, "effectiveUri": "https:\/\/ec2.us-west-2.amazonaws.com", "headers": { "content-type": "text\/xml;charset=UTF-8", "transfer-encoding": "chunked", "vary": "Accept-Encoding", "date": "Wed, 06 May 2015 18:01:14 GMT", "server": "AmazonEC2" } } }

Zuerst können wir mit dem folgenden Befehl nur das erste Volume aus der Volumes-Liste angezeigt aufrufen.

$firstVolume = $result->search('Volumes[0]');

Nun benutzen wir den wildcard-indexAusdruck[*], um über die gesamte Liste zu iterieren und auch drei Elemente zu extrahieren und umzubenennen: VolumeId wird in ID umbenannt, AvailabilityZone wird in AZ umbenannt und Size bleibt Size. Wir können diese Elemente extrahieren und umbenennen, indem wir einen Ausdruck multi-hashverwenden, der hinter dem Ausdruck wildcard-index steht.

$data = $result->search('Volumes[*].{ID: VolumeId, AZ: AvailabilityZone, Size: Size}');

Dies gibt uns eine Reihe von PHP-Daten wie folgt:

array(2) { [0] => array(3) { 'AZ' => string(10) "us-west-2a" 'ID' => string(12) "vol-e11a5288" 'Size' => int(30) } [1] => array(3) { 'AZ' => string(10) "us-west-2a" 'ID' => string(12) "vol-2e410a47" 'Size' => int(8) } }

In der multi-hash Notation können Sie auch verkettete Schlüssel wie key1.key2[0].key3 verwenden, um tief geschachtelte Elemente innerhalb der Struktur zu filtern. Das Beispiel unten zeigt dies anhand des Schlüssels Attachments[0].InstanceIdfür den der einfache Alias InstanceId verwendet wird. (In den meisten Fällen ignorieren JMESPath-Ausdrücke Leerzeichen.)

$expr = 'Volumes[*].{ID: VolumeId, InstanceId: Attachments[0].InstanceId, AZ: AvailabilityZone, Size: Size}'; $data = $result->search($expr); var_dump($data);

Der vorherige Ausdruck gibt folgende Daten aus:

array(2) { [0] => array(4) { 'ID' => string(12) "vol-e11a5288" 'InstanceId' => string(10) "i-a071c394" 'AZ' => string(10) "us-west-2a" 'Size' => int(30) } [1] => array(4) { 'ID' => string(12) "vol-2e410a47" 'InstanceId' => string(10) "i-4b41a37c" 'AZ' => string(10) "us-west-2a" 'Size' => int(8) } }

Sie können auch mehrere Elemente mit dem multi-list Ausdruck[key1, key2] filtern: Dadurch werden alle gefilterten Attribute in einer einzelnen geordneten Liste pro Objekt formatiert, unabhängig vom Typ.

$expr = 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]'; $data = $result->search($expr); var_dump($data);

Das Ausführen der vorherigen Suche erzeugt die folgenden Daten:

array(2) { [0] => array(4) { [0] => string(12) "vol-e11a5288" [1] => string(10) "i-a071c394" [2] => string(10) "us-west-2a" [3] => int(30) } [1] => array(4) { [0] => string(12) "vol-2e410a47" [1] => string(10) "i-4b41a37c" [2] => string(10) "us-west-2a" [3] => int(8) } }

Verwenden Sie einen Ausdruck filter, um die Ergebnisse nach dem Wert eines bestimmten Feldes zu filtern. Die folgende Beispielabfrage gibt nur Volumes in der Availability Zoneus-west-2a aus.

$data = $result->search("Volumes[?AvailabilityZone ## 'us-west-2a']");

JMESPath unterstützt auch Funktionsausdrücke. Nehmen wir an, Sie möchten die gleiche Abfrage wie oben ausführen, rufen aber stattdessen alle Volumes ab, in denen sich das Volume in einemAWSRegion, die mit „uns-“ beginnt. Der folgende Ausdruck verwendet die Funktion starts_with und übergibt ein String-Literal von us-. Das Ergebnis dieser Funktion wird dann mit dem JSON-Literalwert von true verglichen, wobei nur die Ergebnisse des Filterprädikats weitergegeben werden, das true durch die Filterprojektion zurückgegeben hat.

$data = $result->search('Volumes[?starts_with(AvailabilityZone, 'us-') ## `true`]');

Extrahieren von Daten aus Paginators

Wie Sie wissen aus demPaginators in derAWS SDK for PHPVersion 3führer,Aws\ResultPaginator-Objekte werden verwendet, um Ergebnisse aus einer auslagerbaren API-Operation zu erhalten. Mit dem AWS SDK for PHP können Sie gefilterte Daten von Aws\ResultPaginator-Objekten extrahieren und iterieren, wobei Sie im wesentlichen ein flat-map-Objekt über dem Iterator implementieren, in dem das Ergebnis eines JMESPath-Ausdrucks die Map-Funktion ist.

Nehmen wir an, Sie möchten eine iterator erstellen, die nur Objekte aus einem Bucket liefert, die größer als 1 MB sind. Dies kann erreicht werden, indem zuerst ein ListObjectsUmbruch erzeugt wird und dann eine search() -Funktion auf den Umbruch angewendet wird, wodurch ein Flat-Mapped-Iterator über den paginierten Daten erzeugt wird.

$result = $s3Client->getPaginator('ListObjects', ['Bucket' => 't1234']); $filtered = $result->search('Contents[?Size > `1048576`]'); // The result yielded as $data will be each individual match from // Contents in which the Size attribute is > 1048576 foreach ($filtered as $data) { var_dump($data); }