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
JMESPathAws\ResultInterface
eAws\ResultPaginator
.
È possibile acquisire familiarità con JMESPath nel browser utilizzando gli esempi per JMESPath
LaAWS CLI
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\ResultPaginator
gli 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
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); }