Catégories :

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

TRY_PARSE_JSON

Une version spéciale de PARSE_JSON qui renvoie une valeur NULL si une erreur se produit pendant l’analyse.

Syntaxe

TRY_PARSE_JSON( <expr> )

Arguments

expr

Une expression de type chaîne (par exemple VARCHAR).

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, cette fonction 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 TRY_PARSE_JSON sont (presque) des fonctions converses ou réciproques.

    La fonction TRY_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(TRY_PARSE_JSON(X));

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

    '{"pi":3.14,"e":2.71}' = TO_JSON(TRY_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 à TRY_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 TRY_PARSE_JSON pour analyser des chaînes contenant des valeurs pouvant être analysées comme JSON :

Créez et remplissez une table.

create or replace temporary table vartab (ID INTEGER, v VARCHAR);

insert into vartab (id, v) VALUES 
    (1, '[-1, 12, 289, 2188, false,]'), 
    (2, '{ "x" : "abc", "y" : false, "z": 10} '),
    (3, '{ "bad" : "json", "missing" : true, "close_brace": 10 ');

Interroger les données à l’aide de TRY_PARSE_JSON. Notez que la valeur de la troisième ligne est NULL. Si la requête avait utilisé PARSE_JSON plutôt que TRY_PARSE_JSON, la requête aurait échoué.

SELECT ID, try_parse_json(v) 
    FROM vartab
    ORDER BY ID;
+----+-------------------+
| ID | TRY_PARSE_JSON(V) |
|----+-------------------|
|  1 | [                 |
|    |   -1,             |
|    |   12,             |
|    |   289,            |
|    |   2188,           |
|    |   false,          |
|    |   undefined       |
|    | ]                 |
|  2 | {                 |
|    |   "x": "abc",     |
|    |   "y": false,     |
|    |   "z": 10         |
|    | }                 |
|  3 | NULL              |
+----+-------------------+