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
JMESPathAws\ResultInterface
danAws\ResultPaginator
.
Anda dapat bermain-main dengan JMesPath di browser Anda dengan mencoba onlineContoh jmesPath
KlasterAWS CLI
Mengekstrak data dari hasil
KlasterAws\ResultInterface
antarmuka 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-index
ekspresi[*]
untuk iterate atas seluruh daftar dan juga ekstrak dan mengubah nama tiga elemen:VolumeId
berganti nama menjadiID
,AvailabilityZone
berganti nama menjadiAZ
, danSize
sisaSize
. Kita dapat mengekstrak dan mengganti nama elemen-elemen ini menggunakanmulti-hash
ekspresi ditempatkan setelahwildcard-index
ekspresi
$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-hash
notasi, Anda juga dapat menggunakan tombol dirantai sepertikey1.key2[0].key3
untuk mengekstrak elemen yang sangat bersarang di dalam struktur. Contoh berikut menunjukkan ini denganAttachments[0].InstanceId
kunci, 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-list
Ekspresi:[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 afilter
ekspresi untuk menyaring hasil dengan nilai bidang tertentu. Contoh berikut query output hanya volume dius-west-2a
Availability 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_with
fungsi, lewat dalam string literalus-
. Hasil fungsi ini kemudian dibandingkan dengan nilai literal JSONtrue
, hanya melewati hasil predikat filter yang dikembalikantrue
melalui 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\ResultPaginator
objek yang digunakan untuk menghasilkan hasil dari operasi API pageable. KlasterAWS SDK for PHPmemungkinkan Anda untuk mengekstrak dan iterate atas data yang disaring dariAws\ResultPaginator
objek, pada dasarnya menerapkandatar-map
Katakanlah Anda ingin membuatiterator
yang hanya menghasilkan objek dari bucket yang lebih besar dari 1 MB. Hal ini dapat dicapai dengan terlebih dahulu membuatListObjects
paginator 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); }