Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
JMESPath expresiones en la AWS SDK para PHP versión 3
JMESPathAws\ResultInterface
Aws\ResultPaginator
Puedes jugar con ellas JMESPath en tu navegador probando los ejemplos en línea. JMESPath
Los AWS CLI
Extraer datos de los resultados
La Aws\ResultInterface
interfaz tiene un search($expression)
método que extrae datos de un modelo de resultados basado en una JMESPath expresión. El uso de JMESPath expresiones para consultar los datos de un objeto de resultado puede ayudar a eliminar el código condicional repetitivo y a expresar de forma más concisa los datos que se están extrayendo.
Para demostrar cómo funciona, comenzaremos con el resultado JSON predeterminado que aparece a continuación, que describe dos volúmenes de Amazon Elastic Block Store (Amazon EBS) adjuntos a instancias de Amazon independientes. EC2
$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" } } }
En primer lugar, podemos obtener solo el primer volumen de la lista Volumes con el comando siguiente.
$firstVolume = $result->search('Volumes[0]');
Ahora, utilizamos la expresión wildcard-index
[*]
para iterar por toda la lista, extrayendo y cambiando el nombre de tres elementos: VolumeId
cambia a ID
, AvailabilityZone
cambia a AZ
y Size
se mantiene como Size
. Podemos extraer y cambiar el nombre de estos elementos mediante una expresión multi-hash
situada después de la expresión wildcard-index
.
$data = $result->search('Volumes[*].{ID: VolumeId, AZ: AvailabilityZone, Size: Size}');
Esto resulta en una matriz de datos PHP como la siguiente:
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) } }
En la notación multi-hash
también puede utilizar claves encadenadas como key1.key2[0].key3
para extraer los elementos profundamente anidados en la estructura. El ejemplo siguiente lo ilustra con la clave Attachments[0].InstanceId
a la que se aplica simplemente el alias InstanceId
. (En la mayoría de los casos, JMESPath las expresiones ignorarán los espacios en blanco).
$expr = 'Volumes[*].{ID: VolumeId, InstanceId: Attachments[0].InstanceId, AZ: AvailabilityZone, Size: Size}'; $data = $result->search($expr); var_dump($data);
La expresión anterior devolverá los datos siguientes:
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) } }
También puede filtrar varios elementos con la expresión multi-list
: [key1, key2]
. Con ella todos los atributos filtrados adoptan la forma de una única lista ordenada por cada objeto, independientemente de su tipo.
$expr = 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]'; $data = $result->search($expr); var_dump($data);
La ejecución de la búsqueda anterior produce los datos siguientes:
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) } }
Utilice una expresión filter
para filtrar los resultados por el valor de un campo específico. El siguiente ejemplo de consulta devuelve únicamente los volúmenes de la zona de disponibilidad us-west-2a
.
$data = $result->search("Volumes[?AvailabilityZone ## 'us-west-2a']");
JMESPath también admite expresiones de funciones. Supongamos que desea ejecutar la misma consulta que la anterior y, en su lugar, recuperar todos los volúmenes en los que el volumen se encuentre en una AWS región que comience por «us-». La expresión siguiente utiliza la función starts_with
y le pasa la cadena literal us-
. El resultado de esta función se compara entonces con el valor literal JSON true
, pasando solo los resultados del predicado de filtro que hayan devuelto true
en la proyección del filtro.
$data = $result->search('Volumes[?starts_with(AvailabilityZone, 'us-') ## `true`]');
Extraer datos de paginadores
Como se indicó en el apartado Paginadores de la guía de la versión 3 de, AWS SDK para PHP, los objetos Aws\ResultPaginator
objects se utilizan para obtener resultados de una operación paginable de la API. AWS SDK para PHP Esto permite extraer e iterar los datos filtrados de los Aws\ResultPaginator
objetos y, básicamente, implementar un mapa plano
Supongamos que desea crear un objeto iterator
que solo devuelva los objetos de un bucket con un tamaño superior a 1 MB. Esto puede conseguirse creando primero un paginador ListObjects
y aplicándole entonces una función search()
para crear un iterador de mapa plano para los datos paginados.
$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); }