Kategorien:

Funktionen für semistrukturierte und strukturierte Daten (Analyse)

TRY_PARSE_JSON

Eine spezielle Version von PARSE_JSON, die einen NULL-Wert zurückgibt, wenn beim Parsing ein Fehler auftritt.

Syntax

TRY_PARSE_JSON( <expr> )
Copy

Argumente

expr

Ein Ausdruck eines Zeichenfolgentyps (z. B. VARCHAR).

Rückgabewerte

Der zurückgegebene Wert ist vom Typ VARIANT und enthält ein JSON-Dokument.

Nutzungshinweise

  • Diese Funktion unterstützt einen Eingabeausdruck mit einer maximalen komprimierten Größe von 8 MB.

  • Wenn der Eingabewert NULL ist, ist auch der Ausgabewert NULL. Wenn die Eingabezeichenfolge jedoch 'null' ist, wird das als JSON-Nullwert interpretiert, sodass das Ergebnis nicht SQL NULL ist, sondern ein gültiger VARIANT-Wert, der null enthält.

  • Beim Analysieren von Dezimalzahlen versucht die Funktion, die Genauigkeit der Darstellung zu erhalten, indem 123,45 als NUMBER(5,2) und nicht als DOUBLE behandelt wird. Zahlen in wissenschaftlicher Notation (z. B. 1,2345e+02) oder Zahlen, die aufgrund von Bereichs- oder Skalierungsbegrenzungen nicht als Festkomma-Dezimalzahlen gespeichert werden können, werden jedoch als DOUBLE gespeichert. Da JSON Werte wie TIMESTAMP, DATE, TIME oder BINARY nativ nicht darstellt, müssen diese als Zeichenfolgen dargestellt werden.

  • In JSON ist ein Objekt (auch als „Wörterbuch“ oder „Hash“ bezeichnet) eine ungeordnete Menge von Schlüssel-Wert-Paaren. TO_JSON und TRY_PARSE_JSON sind (fast) konverse oder reziproke Funktionen.

    Die Funktion TRY_PARSE_JSON nutzt eine Zeichenfolge als Eingabe und gibt eine JSON-kompatible Variante zurück. Die Funktion TO_JSON nutzt eine JSON-kompatible Variante und gibt eine Zeichenfolge zurück. Folgendes ist (konzeptionell) wahr (true), wenn X eine Zeichenfolge ist, die gültiges JSON enthält:

    X = TO_JSON(TRY_PARSE_JSON(X));

    So ist zum Beispiel Folgendes (konzeptionell) wahr (true):

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

    Die Funktionen sind jedoch aus zwei Gründen nicht perfekt reziprok:

    • Die Reihenfolge der Schlüssel-Wert-Paare in der von TO_JSON erzeugten Zeichenfolge ist nicht vorhersehbar.

    • Die von TO_JSON erzeugte Zeichenfolge kann weniger Leerzeichen enthalten als die an TRY_PARSE_JSON übergebene Zeichenfolge.

    Folgende Angaben sind äquivalente in JSON, aber keine äquivalenten Zeichenfolgen:

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

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

Beispiele

Hier ein Beispiel für das Speichern verschiedener Datentypen in einer VARIANT-Spalte, indem Sie TRY_PARSE_JSON aufrufen, um Zeichenfolgen zu analysieren, die Werte enthalten, die als JSON analysiert werden können:

Erstellen Sie eine Tabelle, und füllen Sie diese.

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 ');
Copy

Fragen Sie die Daten mit TRY_PARSE_JSON ab. Beachten Sie, dass der Wert für die dritte Zeile NULL ist. Wenn die Abfrage PARSE_JSON anstelle von TRY_PARSE_JSON verwendet hätte, wäre die Abfrage fehlgeschlagen.

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              |
+----+-------------------+
Copy