Espressioni JMESPath inAWS SDK for PHPVersione 3 - AWS SDK for PHP

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Espressioni JMESPath inAWS SDK for PHPVersione 3

JMESPath consente di specificare in modo dichiarativo come estrarre elementi da un documento in formato JSON. LaAWS SDK for PHPha una dipendenza dajmespath.phpper alimentare alcune delle astrazioni di alto livello comeImpaginatori inAWS SDK for PHPVersione 3eWaiter nell'AWS SDK for PHPVersione 3, ma espone anche la ricerca JMesPath suAws\ResultInterfaceeAws\ResultPaginator.

È possibile acquisire familiarità con JMESPath nel browser utilizzando gli esempi per JMESPath online. Per ulteriori informazioni sul linguaggio, incluse le espressioni e le funzioni disponibili, consulta la specifica JMESPath.

LaAWS CLIsupporta JMESPath. Le espressioni create per l'output CLI sono del tutto compatibili con le espressioni create per AWS SDK for PHP.

Estrarre dati da risultati

L'interfaccia Aws\ResultInterface include un metodo search($expression) che consente l'estrazione di dati da un modello di risultati basato su un'espressione JMESPath. L'utilizzo di espressioni JMESPath per eseguire query sui dati di un oggetto risultato può aiutare a rimuovere codice boilerplate condizionale e a esprimere in modo più conciso i dati estratti.

Per dimostrarne il funzionamento, di seguito è riportato l'output JSON predefinito, che descrive due volumi Amazon Elastic Block Store (Amazon EBS) associati a istanze Amazon EC2 separate.

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

Innanzitutto, è possibile recuperare solo il primo volume dall'elenco dei volumi con il comando seguente.

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

Quindi, viene utilizzata l'espressione wildcard-index [*] per la reiterazione nell'intero elenco e, inoltre, vengono estratti e rinominati tre elementi: VolumeId viene rinominato in ID, AvailabilityZone viene rinominato in AZ e Size resta Size. È possibile estrarre e rinominare questi elementi utilizzando un'espressione multi-hash posta dopo l'espressione wildcard-index.

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

Ciò offre una serie di dati PHP come i seguenti:

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

Nella notazione multi-hash è possibile anche usare chiavi concatenate, ad esempio key1.key2[0].key3 , per estrarre elementi profondamente nidificati all'interno della struttura. L'esempio di seguito mostra questo tipo di utilizzo con la chiave Attachments[0].InstanceId assegnata semplicemente in alias a InstanceId. Nella maggior parte dei casi, le espressioni JMESPath ignoreranno gli spazi.

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

L'espressione precedente genererà i seguenti dati:

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

È inoltre possibile filtrare più elementi con l'espressione multi-list:[key1, key2]. In questo modo verranno formattati tutti gli attributi filtrati in un unico elenco ordinato per ogni oggetto, indipendentemente dal tipo.

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

L'esecuzione della ricerca precedente produce i seguenti dati:

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

Utilizza un'espressione filter per filtrare i risultati in base al valore di un campo specifico. Il seguente esempio genera soltanto volumi nella us-west-2a zona di disponibilità.

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

JMESPath supporta anche espressioni di funzioni. Si supponga di voler eseguire la query riportata sopra, ma di recuperare tutti i volumi che si trovano inAWSRegione che inizia con «noi-». La seguente espressione utilizza la funzione starts_with e passa una stringa letterale di us-. Il risultato di questa funzione viene quindi confrontato con il valore letterale JSON true, passando solo i risultati del predicato del filtro che ha restituito true mediante la proiezione del filtro.

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

Estrarre dati da impaginatori

Come sapete dalImpaginatori inAWS SDK for PHPVersione 3guide,Aws\ResultPaginatorgli oggetti vengono utilizzati per produrre risultati da un'operazione API impaginabile. AWS SDK for PHP consente di estrarre ed eseguire l'iterazione su dati filtrati di oggetti Aws\ResultPaginator, implementando essenzialmente una funzione flatmap sull'iterazione in cui il risultato di un'espressione JMESPath è la funzione di mappatura.

Supponiamo di volere creare una funzione iterator che produca solo oggetti da un bucket di dimensioni superiori a 1 MB. Questo risultato può essere ottenuto creando innanzitutto un impaginatore ListObjects, quindi applicando ad esso una funzione search() e creando un'iterazione di tipo flatmap sui dati impaginati.

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