

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# JMESPath expressões na AWS SDK para PHP versão 3
<a name="guide_jmespath"></a>

 [JMESPath](http://jmespath.org/)permite que você especifique declarativamente como extrair elementos de um documento JSON. AWS SDK para PHP O depende do [jmespath.php](https://github.com/jmespath/jmespath.php) para alimentar algumas abstrações de alto nível, como [paginadores na AWS SDK para PHP versão 3 e garçons na versão 3](guide_paginators.md)[, mas também expõe a AWS SDK para PHP pesquisa em](guide_waiters.md) e. JMESPath `Aws\ResultInterface` `Aws\ResultPaginator`

Você pode brincar com JMESPath o seu navegador experimentando os [JMESPath exemplos](http://jmespath.org/examples.html) online. Você pode aprender mais sobre a linguagem, incluindo as expressões e funções disponíveis, na [JMESPath especificação](http://jmespath.org/specification.html).

Os [AWS CLI](https://aws.amazon.com/cli/)suportes JMESPath. As expressões que você escreve para saída da CLI são 100% compatíveis com expressões escritas para o AWS SDK para PHP.

## Extração de dados dos resultados
<a name="extracting-data-from-results"></a>

A `Aws\ResultInterface` interface tem um `search($expression)` método que extrai dados de um modelo de resultados com base em uma JMESPath expressão. Usar JMESPath expressões para consultar os dados de um objeto resultante pode ajudar a remover o código condicional padronizado e a expressar de forma mais concisa os dados que estão sendo extraídos.

Para demonstrar como funciona, começaremos com a saída JSON padrão abaixo, que descreve dois volumes do Amazon Elastic Block Store (Amazon EBS) anexados a instâncias separadas do Amazon 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"
        }
    }
}
```

Primeiro, podemos recuperar somente o primeiro volume da lista Volumes com o seguinte comando.

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

Agora, usamos a expressão `wildcard-index` `[*]` para iterar sobre a lista inteira e também para extrair e renomear três elementos: `VolumeId` é renomeado para `ID`, `AvailabilityZone` é renomeada para `AZ` e `Size` permanece `Size`. Podemos extrair e renomear esses elementos usando uma expressão `multi-hash` colocada depois da expressão `wildcard-index`.

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

Isso fornece uma matriz de dados do PHP, como a seguinte:

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

Na notação `multi-hash`, também é possível usar chaves encadeadas, como `key1.key2[0].key3` para extrair elementos altamente aninhados na estrutura. O exemplo a seguir demonstra isso com a chave `Attachments[0].InstanceId`, com o alias simples `InstanceId`. (Na maioria dos casos, JMESPath as expressões ignorarão os espaços em branco.)

```
$expr = 'Volumes[*].{ID: VolumeId,
                     InstanceId: Attachments[0].InstanceId,
                     AZ: AvailabilityZone,
                     Size: Size}';

$data = $result->search($expr);
var_dump($data);
```

A saída da expressão anterior conterá os seguintes dados:

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

Você também pode filtrar vários elementos com a expressão `multi-list`: `[key1, key2]`. Isso formata todos os atributos filtrados em uma única lista ordenada por objeto, independentemente do tipo.

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

A execução da pesquisa anterior produz os seguintes dados:

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

Use uma expressão `filter` para filtrar os resultados de um campo específico. A consulta de exemplo a seguir produz apenas volumes na zona de disponibilidade `us-west-2a`.

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

JMESPath também suporta expressões de função. Digamos que você queira executar a mesma consulta acima, mas, em vez disso, recuperar todos os volumes nos quais o volume está em uma AWS região que começa com “us-”. A expressão a seguir usa a função `starts_with`, passando uma sequência literal de `us-`. O resultado dessa função é comparado com o valor literal `true` do JSON passando apenas os resultados do predicado do filtro que retornou `true` por meio da projeção do filtro.

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

## Extração de dados dos paginadores
<a name="extracting-data-from-paginators"></a>

Como você sabe, no guia [Paginadores no AWS SDK para PHP Versão 3](guide_paginators.md), os objetos `Aws\ResultPaginator` são usados para gerar resultados de uma operação de API paginável. O AWS SDK para PHP permite que você extraia e itere dados filtrados de `Aws\ResultPaginator` objetos, implementando essencialmente um [mapa plano](http://martinfowler.com/articles/collection-pipeline/flat-map.html) sobre o iterador, no qual o resultado de uma JMESPath expressão é a função de mapa.

Vamos supor que você queira criar um `iterator` que produza apenas objetos de um bucket maior que um MB. Isso pode ser obtido criando um paginador `ListObjects` primeiro e, em seguida, aplicando uma função `search()` ao paginador, criando um iterador com mapa plano sobre os dados 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);
}
```