Kategorien:

Semistrukturierte Datenfunktionen (Analyse)

PARSE_JSON

Interpretiert eine Eingabezeichenfolge als JSON-Dokument und erzeugt einen VARIANT-Wert.

Siehe auch:

TRY_PARSE_JSON

Syntax

PARSE_JSON( <expr> )

Argumente

Ausdruck

Ein Ausdruck eines Zeichenfolgentyps (z. B. VARCHAR), der gültige JSON-Daten enthält.

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 die Eingabe NULL ist, lautet die Ausgabe 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 PARSE_JSON, 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 hingegen 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 PARSE_JSON sind (fast) konverse oder reziproke Funktionen.

    Die Funktion 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, wenn X eine Zeichenfolge ist, die gültige JSON enthält:

    X = TO_JSON(PARSE_JSON(X));

    Zum Beispiel ist Folgendes (konzeptionell) wahr:

    '{"pi":3.14,"e":2.71}' = TO_JSON(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 PARSE_JSON übergebene Zeichenfolge.

    Folgende sind äquivalente 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 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. Beachten Sie, dass die Anweisung INSERT die Funktion PARSE_JSON verwendet.

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;

Fragen Sie die Daten ab:

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