ekspresi JMesPath diAWS SDK for PHPVersi 3 - AWS SDK for PHP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

ekspresi JMesPath diAWS SDK for PHPVersi 3

JMESPathmemungkinkan Anda untuk secara deklaratif menentukan cara mengekstrak elemen dari dokumen JSON. KlasterAWS SDK for PHPmemiliki ketergantungan padajmespath.phpuntuk menyalakan beberapa abstraksi tingkat tinggi sepertiPaginator diAWS SDK for PHPVersi 3danPelayan diAWS SDK for PHPVersi 3, tetapi juga mengekspos pencarian JMESPathAws\ResultInterfacedanAws\ResultPaginator.

Anda dapat bermain-main dengan JMesPath di browser Anda dengan mencoba onlineContoh jmesPath. Anda dapat mempelajari lebih lanjut tentang bahasa, termasuk ekspresi dan fungsi yang tersedia, diSpesifikasi JMESpath.

KlasterAWS CLImendukung JMESpath. Ekspresi yang Anda tulis untuk keluaran CLI 100 persen kompatibel dengan ekspresi yang ditulis untukAWS SDK for PHP.

Mengekstrak data dari hasil

KlasterAws\ResultInterfaceantarmuka memilikisearch($expression)metode yang mengekstrak data dari model hasil berdasarkan ekspresi JMESPath. Menggunakan ekspresi JMESPath untuk query data dari objek hasil dapat membantu untuk menghapus boilerplate kode kondisional, dan lebih ringkas mengungkapkan data yang sedang diekstraksi.

Untuk mendemonstrasikan cara kerjanya, kita akan mulai dengan output JSON default di bawah ini, yang menjelaskan dua volume Amazon Elastic Block Store (Amazon EBS) yang dilampirkan ke instans Amazon EC2 terpisah.

$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" } } }

Pertama, kita dapat mengambil hanya volume pertama dari daftar Volume dengan perintah berikut.

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

Sekarang, kita menggunakanwildcard-indexekspresi[*]untuk iterate atas seluruh daftar dan juga ekstrak dan mengubah nama tiga elemen:VolumeIdberganti nama menjadiID,AvailabilityZoneberganti nama menjadiAZ, danSizesisaSize. Kita dapat mengekstrak dan mengganti nama elemen-elemen ini menggunakanmulti-hashekspresi ditempatkan setelahwildcard-indexekspresi

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

Ini memberi kita array data PHP seperti berikut:

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) } }

Dimulti-hashnotasi, Anda juga dapat menggunakan tombol dirantai sepertikey1.key2[0].key3untuk mengekstrak elemen yang sangat bersarang di dalam struktur. Contoh berikut menunjukkan ini denganAttachments[0].InstanceIdkunci, alias untuk sederhanaInstanceId. (Dalam kebanyakan kasus, ekspresi JMesPath akan mengabaikan spasi.)

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

Ekspresi sebelumnya akan menampilkan data berikut:

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) } }

Anda juga dapat memfilter beberapa elemen denganmulti-listEkspresi:[key1, key2]. Ini memformat semua atribut yang disaring ke dalam daftar berurutan tunggal per objek, terlepas dari jenisnya.

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

Menjalankan pencarian sebelumnya menghasilkan data berikut:

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) } }

Gunakan afilterekspresi untuk menyaring hasil dengan nilai bidang tertentu. Contoh berikut query output hanya volume dius-west-2aAvailability Zone.

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

JMesPath juga mendukung ekspresi fungsi. Katakanlah Anda ingin menjalankan kueri yang sama seperti di atas, tetapi mengambil semua volume di mana volume berada dalamAWSWilayah yang dimulai dengan “kita-”. Ekspresi berikut menggunakanstarts_withfungsi, lewat dalam string literalus-. Hasil fungsi ini kemudian dibandingkan dengan nilai literal JSONtrue, hanya melewati hasil predikat filter yang dikembalikantruemelalui proyeksi filter.

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

Mengekstrak data dari paginator

Seperti yang Anda ketahui dariPaginator diAWS SDK for PHPVersi 3membimbingAws\ResultPaginatorobjek yang digunakan untuk menghasilkan hasil dari operasi API pageable. KlasterAWS SDK for PHPmemungkinkan Anda untuk mengekstrak dan iterate atas data yang disaring dariAws\ResultPaginatorobjek, pada dasarnya menerapkandatar-mapatas iterator di mana hasil ekspresi JMesPath adalah fungsi peta.

Katakanlah Anda ingin membuatiteratoryang hanya menghasilkan objek dari bucket yang lebih besar dari 1 MB. Hal ini dapat dicapai dengan terlebih dahulu membuatListObjectspaginator dan kemudian menerapkansearch()berfungsi untuk paginator, menciptakan iterator datar dipetakan atas data paginasi.

$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); }