Catégories :

Fonctions de données semi-structurées (Parsing)

PARSE_JSON

Interprète une chaîne d’entrée comme un document JSON, produisant une valeur VARIANT.

Voir aussi :

TRY_PARSE_JSON

Syntaxe

PARSE_JSON( <expr> )

Arguments

expr

Une expression de type chaîne (par exemple VARCHAR) qui contient des informations valides JSON.

Renvoie

La valeur renvoyée est de type VARIANT et contient un document JSON.

Notes sur l’utilisation

  • Cette fonction prend en charge une expression d’entrée avec une taille maximale de 8 MB compressée.

  • Si l’entrée est NULL, la sortie est NULL aussi. Toutefois, si la chaîne entrée est 'null', elle est interprétée comme une valeur JSON nulle de sorte que le résultat ne soit pas SQL NULL, mais une valeur VARIANT valide contenant null.

  • Lors de l’analyse des nombres décimaux, PARSE_JSON tente de préserver l’exactitude de la représentation en considérant 123,45 comme NUMBER(5,2) et non comme DOUBLE. Toutefois, les nombres utilisant une notation scientifique (c’est-à-dire 1,2345e+02) ou des nombres qui ne peuvent pas être stockés sous forme de nombres décimaux à virgule fixe en raison de limitations de plage ou d’échelle sont stockés sous la forme DOUBLE. Comme JSON ne représente pas des valeurs telles que TIMESTAMP, DATE, TIME ou BINARY de manière native, celles-ci doivent être représentées sous forme de chaînes.

  • Dans JSON, un objet (également appelé « dictionnaire » ou « hachage ») est un ensemble non ordonné de paires clé-valeur. TO_JSON et PARSE_JSON sont (presque) des fonctions converses ou réciproques.

    La fonction PARSE_JSON prend une chaîne en entrée et renvoie une variante compatible avec JSON. La fonction TO_JSON utilise une variante compatible avec JSON et renvoie une chaîne. Conceptuellement, ce qui suit est vrai si X est une chaîne contenant du code JSON valide :

    X = TO_JSON(PARSE_JSON(X));

    Par exemple, ce qui suit est vrai (conceptuellement) :

    '{"pi":3.14,"e":2.71}' = TO_JSON(PARSE_JSON('{"pi":3.14,"e":2.71}'))

    Cependant, les fonctions ne sont pas parfaitement réciproques pour deux raisons :

    • L’ordre des paires clé-valeur dans la chaîne produite par TO_JSON n’est pas prévisible.

    • La chaîne produite par TO_JSON peut avoir moins d’espaces que la chaîne transmise à PARSE_JSON.

    Les éléments suivants sont des équivalents JSON, mais pas des chaînes équivalentes :

    • {"pi": 3.14, "e": 2.71}

    • {"e":2.71,"pi":3.14}

Exemples

Cela montre un exemple de stockage de différents types de données dans une colonne VARIANT en appelant PARSE_JSON pour analyser des chaînes contenant des valeurs pouvant être analysées comme JSON :

Créez et remplissez une table. Notez que l’instruction INSERT utilise la fonction PARSE_JSON.

create or replace table vartab (n number(2), v variant);

insert into vartab
    select column1 as n, parse_json(column2) as v
    from values (1, 'null'), 
                (2, null), 
                (3, 'true'),
                (4, '-17'), 
                (5, '123.12'), 
                (6, '1.912e2'),
                (7, '"Om ara pa ca na dhih"  '), 
                (8, '[-1, 12, 289, 2188, false,]'), 
                (9, '{ "x" : "abc", "y" : false, "z": 10} ') 
       AS vals;

Interroger les données :

select n, v, typeof(v) from vartab;
+---+------------------------+------------+
| N | V                      | TYPEOF(V)  |
|---+------------------------+------------|
| 1 | null                   | NULL_VALUE |
| 2 | NULL                   | NULL       |
| 3 | true                   | BOOLEAN    |
| 4 | -17                    | INTEGER    |
| 5 | 123.12                 | DECIMAL    |
| 6 | 1.912000000000000e+02  | DOUBLE     |
| 7 | "Om ara pa ca na dhih" | VARCHAR    |
| 8 | [                      | ARRAY      |
|   |   -1,                  |            |
|   |   12,                  |            |
|   |   289,                 |            |
|   |   2188,                |            |
|   |   false,               |            |
|   |   undefined            |            |
|   | ]                      |            |
| 9 | {                      | OBJECT     |
|   |   "x": "abc",          |            |
|   |   "y": false,          |            |
|   |   "z": 10              |            |
|   | }                      |            |
+---+------------------------+------------+