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 JMESPathAws\ResultInterface
undAws\ResultPaginator
.
Sie können mit JMESPath in Ihrem Browser herumspielen, indem Sie die Online-JMESPath Beispiele
DieAWS CLI
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-index
Ausdruck[*]
, 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-hash
verwenden, 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].InstanceId
fü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
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 ListObjects
Umbruch 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); }