

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.

# Extraction de données JSON à partir de chaînes
<a name="extracting-data-from-JSON"></a>

Vous pouvez disposer de données source contenant des chaînes codées en JSON que vous ne souhaitez pas forcément désérialiser dans une table dans Athena. Dans ce cas, vous pouvez toujours exécuter des opérations SQL sur ces données à l'aide des fonctions JSON disponibles dans Presto.

Envisagez cette chaîne JSON comme exemple d'ensemble de données.

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

## Exemples : extraction de propriétés
<a name="examples-extracting-properties"></a>

Pour extraire les propriétés `name` et `projects` de la chaîne JSON, utilisez la fonction `json_extract` comme dans l'exemple suivant. La fonction `json_extract` utilise la colonne contenant la chaîne JSON et effectue une recherche dans celle-ci à l'aide d'une expression de type `JSONPath` avec la notation de points `.`.

**Note**  
 `JSONPath` effectue un parcours simple de l'arborescence. Cette expression utilise le signe `$` pour indiquer la racine du document JSON, suivi d'un point et d'un élément imbriqué directement sous la racine, par exemple `$.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
```

La valeur renvoyée est une chaîne codée en JSON et non un type de données Athena natif.

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

Pour extraire la valeur scalaire de la chaîne JSON, utilisez la fonction `json_extract_scalar({{json}}, {{json_path}})`. Cette fonction est semblable à `json_extract`, mais renvoie une valeur de chaîne `varchar` au lieu d’une chaîne encodée en JSON. La valeur du {{json\_path}} paramètre doit être un scalaire (booléen, numérique ou chaîne).

**Note**  
N'utilisez pas la fonction `json_extract_scalar` sur des tableaux, des mappages ou des structures.

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

Cette requête renvoie :

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

Pour obtenir le premier élément de la propriété `projects` dans l'exemple de tableau, utilisez la fonction `json_array_get` et spécifiez la position d'index.

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

Cette fonction renvoie la valeur à la position d'index spécifiée dans le tableau codé en JSON.

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

Pour renvoyer un type de chaîne Athena, utilisez l'opérateur `[]` à l'intérieur d'une expression `JSONPath`, puis utilisez la fonction `json_extract_scalar`. Pour plus d’informations sur `[]`, consultez [Accès à des éléments de tableau](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
```

Elle renvoie le résultat suivant :

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