

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à.

# Estrarre dati JSON da stringhe
<a name="extracting-data-from-JSON"></a>

È possibile che alcuni dei dati di origine che contengono stringhe codificate JSON non debbano essere necessariamente deserializzate in una tabella Athena. In tal caso, è comunque possibile eseguire operazioni SQL su questi dati utilizzando le funzioni JSON disponibili in Presto.

Considera questa stringa JSON come un set di dati di esempio.

```
{"name": "Susan Smith",
"org": "engineering",
"projects":
    [
     {"name":"project1", "completed":false},
     {"name":"project2", "completed":true}
    ]
}
```

## Esempi: Estrarre proprietà
<a name="examples-extracting-properties"></a>

Per estrarre le proprietà `name` e `projects` dalla stringa JSON, utilizza la funzione `json_extract`, come nell'esempio seguente. La funzione `json_extract` analizza la colonna contenente la stringa JSON e vi esegue la ricerca impiegando un'espressione LIKE `JSONPath` con la notazione del punto `.`.

**Nota**  
 `JSONPath` esegue un attraversamento semplice della struttura. utilizzando il simbolo `$` per indicare la radice del documento JSON, seguita da un punto e da un elemento nidificato direttamente sotto il livello radice, ad esempio `$.name`.

```
WITH dataset AS (
  SELECT '{"name": "Susan Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},
           {"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT
  json_extract(myblob, '$.name') AS name,
  json_extract(myblob, '$.projects') AS projects
FROM dataset
```

Il valore restituito è una stringa con codifica JSON e non un tipo di dati Athena nativo.

```
+-----------------------------------------------------------------------------------------------+
| name           | projects                                                                     |
+-----------------------------------------------------------------------------------------------+
| "Susan Smith"  | [{"name":"project1","completed":false},{"name":"project2","completed":true}] |
+-----------------------------------------------------------------------------------------------+
```

Per estrarre il valore scalare dalla stringa JSON, utilizza la funzione `json_extract_scalar(json, json_path)`. È simile a `json_extract`, ma restituisce un valore di stringa `varchar` anziché una stringa con codifica JSON. Il valore del *json\$1path* parametro deve essere uno scalare (un valore booleano, un numero o una stringa).

**Nota**  
Non utilizzare la funzione `json_extract_scalar` su matrici, mappe o strutture.

```
WITH dataset AS (
  SELECT '{"name": "Susan Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT
  json_extract_scalar(myblob, '$.name') AS name,
  json_extract_scalar(myblob, '$.projects') AS projects
FROM dataset
```

Questa query restituisce:

```
+---------------------------+
| name           | projects |
+---------------------------+
| Susan Smith    |          |
+---------------------------+
```

Per ottenere il primo elemento della proprietà `projects` nella matrice di esempio, utilizza la funzione `json_array_get` e specifica la posizione indice.

```
WITH dataset AS (
  SELECT '{"name": "Bob Smith",
           "org": "engineering",
           "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
    AS myblob
)
SELECT json_array_get(json_extract(myblob, '$.projects'), 0) AS item
FROM dataset
```

Restituirà il valore nella posizione indice specificata nella matrice codificata JSON.

```
+---------------------------------------+
| item                                  |
+---------------------------------------+
| {"name":"project1","completed":false} |
+---------------------------------------+
```

Per restituire un tipo di stringa Athena, utilizza l'operatore `[]` all'interno di un'espressione `JSONPath`, quindi utilizza la funzione `json_extract_scalar`. Per ulteriori informazioni su `[]`, consultare [Accedere agli elementi della matrice](accessing-array-elements.md).

```
WITH dataset AS (
   SELECT '{"name": "Bob Smith",
             "org": "engineering",
             "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}'
     AS myblob
)
SELECT json_extract_scalar(myblob, '$.projects[0].name') AS project_name
FROM dataset
```

Tale operazione restituisce questo risultato:

```
+--------------+
| project_name |
+--------------+
| project1     |
+--------------+
```