JMESPath expresiones en la AWS SDK para PHP versión 3 - AWS SDK para PHP

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

JMESPathpermite especificar de forma declarativa cómo extraer elementos de un documento JSON. Depende AWS SDK para PHP de jmespath.php para impulsar algunas de las abstracciones de alto nivel, como Paginators en la AWS SDK para PHP versión 3 y Waiters en la AWS SDK para PHP versión 3, pero también permite buscar en y. JMESPath Aws\ResultInterface Aws\ResultPaginator

Puedes jugar con ellas JMESPath en tu navegador probando los ejemplos en línea. JMESPath Puedes obtener más información sobre el lenguaje, incluidas las expresiones y funciones disponibles, en la JMESPath especificación.

Los AWS CLIsoportes JMESPath. Las expresiones que escribe para la salida de la CLI son completamente compatibles con las expresiones escritas para AWS SDK para PHP.

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 AZy 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 sobre el iterador en el que el resultado de una JMESPath expresión es la función de mapa.

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