

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
<a name="guide_jmespath"></a>

 [JMESPath](http://jmespath.org/)permite especificar de forma declarativa cómo extraer elementos de un documento JSON. Depende AWS SDK para PHP de [jmespath.php](https://github.com/jmespath/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](guide_waiters.md)](guide_paginators.md), 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 ](http://jmespath.org/examples.html) Puedes obtener más información sobre el lenguaje, incluidas las expresiones y funciones disponibles, en la [JMESPath especificación](http://jmespath.org/specification.html).

Los [AWS CLI](https://aws.amazon.com/cli/)soportes 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
<a name="extracting-data-from-results"></a>

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 valor de salida JSON predeterminado que se muestra a continuación, que describe dos volúmenes de Amazon Elastic Block Store (Amazon EBS) adjuntos a instancias de Amazon EC2 independientes.

```
$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, las JMESPath 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
<a name="extracting-data-from-paginators"></a>

Como se indicó en el apartado [Paginadores de la guía de la versión 3 de, AWS SDK para PHP](guide_paginators.md), 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](http://martinfowler.com/articles/collection-pipeline/flat-map.html) 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);
}
```