

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# JMESPath espressioni nella AWS SDK per PHP versione 3
<a name="guide_jmespath"></a>

 [JMESPath](http://jmespath.org/)consente di specificare in modo dichiarativo come estrarre elementi da un documento JSON. Dipende da [jmespath.php](https://github.com/jmespath/jmespath.php) per alimentare alcune delle astrazioni di alto livello come [Paginators nella AWS SDK per PHP versione 3 e Waiters nella versione 3](guide_paginators.md)[, ma AWS SDK per PHP espone anche la AWS SDK per PHP ricerca](guide_waiters.md) su e. JMESPath `Aws\ResultInterface` `Aws\ResultPaginator`

[Puoi giocare con il tuo browser provando gli esempi online JMESPath . JMESPath ](http://jmespath.org/examples.html) Puoi saperne di più sul linguaggio, comprese le espressioni e le funzioni disponibili, nelle [JMESPath specifiche](http://jmespath.org/specification.html).

I [AWS CLI](https://aws.amazon.com/cli/)supporti JMESPath. Le espressioni create per l'output CLI sono del tutto compatibili con le espressioni create per AWS SDK per PHP.

## Estrazione di dati dai risultati
<a name="extracting-data-from-results"></a>

L'`Aws\ResultInterface`interfaccia ha un `search($expression)` metodo che estrae i dati da un modello di risultato basato su un' JMESPath espressione. L'uso di JMESPath espressioni per interrogare i dati da un oggetto risultato può aiutare a rimuovere il codice condizionale standard e a esprimere in modo più conciso i dati che vengono estratti.

Per dimostrarne il funzionamento, inizieremo con l'output JSON predefinito riportato di seguito, che descrive due volumi Amazon Elastic Block Store (Amazon EBS) collegati a istanze Amazon EC2 separate.

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

Innanzitutto, è possibile recuperare solo il primo volume dall'elenco dei volumi con il comando seguente.

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

Quindi, viene utilizzata l'espressione `wildcard-index` `[*]` per la reiterazione nell'intero elenco e, inoltre, vengono estratti e rinominati tre elementi: `VolumeId` viene rinominato in `ID`, `AvailabilityZone` viene rinominato in `AZ` e `Size` resta `Size`. È possibile estrarre e rinominare questi elementi utilizzando un'espressione `multi-hash` posta dopo l'espressione `wildcard-index`.

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

Ciò offre una serie di dati PHP come i seguenti:

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

Nella notazione `multi-hash` è possibile anche usare chiavi concatenate, ad esempio `key1.key2[0].key3` , per estrarre elementi profondamente nidificati all'interno della struttura. L'esempio di seguito mostra questo tipo di utilizzo con la chiave `Attachments[0].InstanceId` assegnata semplicemente in alias a `InstanceId`. (Nella maggior parte dei casi, JMESPath le espressioni ignoreranno gli spazi bianchi).

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

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

L'espressione precedente genererà i seguenti dati:

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

È inoltre possibile filtrare più elementi con l'espressione `multi-list`:`[key1, key2]`. In questo modo verranno formattati tutti gli attributi filtrati in un unico elenco ordinato per ogni oggetto, indipendentemente dal tipo.

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

L'esecuzione della ricerca precedente produce i seguenti dati:

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

Utilizza un'espressione `filter` per filtrare i risultati in base al valore di un campo specifico. Il seguente esempio genera soltanto volumi nella `us-west-2a` zona di disponibilità.

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

JMESPath supporta anche le espressioni di funzioni. Supponiamo di voler eseguire la stessa query di cui sopra, ma recuperare invece tutti i volumi in cui il volume si trova in una AWS regione che inizia con «us-». La seguente espressione utilizza la funzione `starts_with` e passa una stringa letterale di `us-`. Il risultato di questa funzione viene quindi confrontato con il valore letterale JSON `true`, passando solo i risultati del predicato del filtro che ha restituito `true` mediante la proiezione del filtro.

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

## Estrazione di dati dagli impaginatori
<a name="extracting-data-from-paginators"></a>

Come sapete dai [Paginators della guida alla AWS SDK per PHP versione 3](guide_paginators.md), `Aws\ResultPaginator` gli oggetti vengono utilizzati per ottenere risultati da un'operazione API paginabile. AWS SDK per PHP Consente di estrarre e iterare dati filtrati dagli `Aws\ResultPaginator` oggetti, essenzialmente implementando una [mappa piatta](http://martinfowler.com/articles/collection-pipeline/flat-map.html) sull'iteratore in cui il risultato di un'espressione è la funzione di mappa. JMESPath 

Supponiamo di volere creare una funzione `iterator` che produca solo oggetti da un bucket di dimensioni superiori a 1 MB. Questo risultato può essere ottenuto creando innanzitutto un impaginatore `ListObjects`, quindi applicando ad esso una funzione `search()` e creando un'iterazione di tipo flatmap sui dati impaginati.

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