

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# JMESPath expressions dans la AWS SDK pour PHP version 3
<a name="guide_jmespath"></a>

 [JMESPath](http://jmespath.org/)vous permet de spécifier de manière déclarative comment extraire des éléments d'un document JSON. AWS SDK pour PHP Il dépend de [jmespath.php](https://github.com/jmespath/jmespath.php) pour alimenter certaines des abstractions de haut niveau, comme [Paginators dans la AWS SDK pour PHP version 3](guide_paginators.md) et [Waiters dans la AWS SDK pour PHP version 3, mais expose JMESPath également la](guide_waiters.md) recherche sur et. `Aws\ResultInterface` `Aws\ResultPaginator`

Vous pouvez jouer avec votre navigateur JMESPath en essayant les [JMESPath exemples](http://jmespath.org/examples.html) en ligne. Pour en savoir plus sur le langage, y compris les expressions et fonctions disponibles, consultez la [JMESPath spécification](http://jmespath.org/specification.html).

Les [AWS CLI](https://aws.amazon.com/cli/)supports JMESPath. Les expressions écrites pour la sortie CLI sont entièrement compatibles avec les expressions écrites pour le kit AWS SDK pour PHP.

## Extraction de données à partir de résultats
<a name="extracting-data-from-results"></a>

L'`Aws\ResultInterface`interface dispose d'une `search($expression)` méthode qui extrait les données d'un modèle de résultat sur la base d'une JMESPath expression. L'utilisation d' JMESPath expressions pour interroger les données d'un objet de résultat peut aider à supprimer le code conditionnel standard et à exprimer de manière plus concise les données extraites.

Pour montrer comment cela fonctionne, nous allons commencer par la sortie JSON par défaut ci-dessous, qui décrit deux volumes Amazon Elastic Block Store (Amazon EBS) attachés à des instances Amazon EC2 distinctes.

```
$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"
        }
    }
}
```

Tout d'abord, nous pouvons récupérer uniquement le premier volume de la liste Volumes à l'aide de la commande suivante.

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

Nous allons maintenant utiliser l'expression `wildcard-index` `[*]` pour parcourir l'ensemble de la liste, extraire, puis renommer trois éléments : `VolumeId` est renommé `ID`, `AvailabilityZone` est renommé `AZ` et `Size` reste `Size`. Nous pouvons extraire et renommer ces éléments à l'aide d'une expression `multi-hash` placée après l'expression `wildcard-index`.

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

Nous obtenons ainsi un tableau de données PHP comme suit :

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

Dans la notation `multi-hash`, vous pouvez également utiliser des clés de chaînes comme `key1.key2[0].key3` pour extraire des éléments profondément imbriqués au sein de la structure. L'exemple suivant illustre ce processus avec la clé `Attachments[0].InstanceId`, dont l'alias est simplement `InstanceId`. (Dans la plupart des cas, JMESPath les expressions ignorent les espaces blancs.)

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

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

L'expression précédente générera les données suivantes :

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

Vous pouvez également filtrer plusieurs éléments avec l'expression `multi-list` :`[key1, key2]`. Cette opération met en forme tous les attributs filtrés dans une seule liste ordonnée par objet, quel que soit le type.

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

Exécuter la recherche précédente génère les données suivantes :

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

Utilisez une expression `filter` pour filtrer les résultats sur la valeur d'un champ spécifique. L'exemple de requête suivant produit en sortie uniquement des volumes dans la zone de disponibilité `us-west-2a`.

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

JMESPath prend également en charge les expressions de fonction. Supposons que vous souhaitiez exécuter la même requête que ci-dessus, mais récupérer tous les volumes dans lesquels le volume se trouve dans une AWS région commençant par « us- ». L'expression suivante utilise la fonction `starts_with`, transmettant un littéral de chaîne de `us-`. Le résultat de cette fonction est ensuite comparé à la valeur JSON littérale de `true`, transmettant uniquement les résultats du prédicat de filtre ayant renvoyés `true` via la projection de filtre.

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

## Extraction de données à partir de paginateurs
<a name="extracting-data-from-paginators"></a>

Comme vous le savez grâce aux [paginateurs du guide de la AWS SDK pour PHP version 3](guide_paginators.md), les `Aws\ResultPaginator` objets sont utilisés pour générer des résultats à partir d'une opération d'API paginable. AWS SDK pour PHP Cela vous permet d'extraire et d'itérer sur des données filtrées à partir d'`Aws\ResultPaginator`objets, en implémentant essentiellement une [carte plate](http://martinfowler.com/articles/collection-pipeline/flat-map.html) au-dessus de l'itérateur dans laquelle le résultat d'une JMESPath expression est la fonction cartographique.

Supposons que vous souhaitiez créer un `iterator` générant uniquement des objets de taille supérieure à 1 Mo à partir d'un compartiment. Cette opération peut être réalisée en créant un programme de pagination `ListObjects`, puis en appliquant une fonction `search()` au programme de pagination et en créant un itérateur « flat-mappé » sur les données paginées.

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