Zum Inhalt springen

JSON-Typ

DuckDB unterstützt json über den logischen Typ JSON. Zum Beispiel:

SELECT '[1, null, {"key": "value"}]'::JSON;
[1, null, {"key": "value"}]

Logisch ist der Typ JSON ähnlich wie VARCHAR, mit der Einschränkung, dass er gültiges JSON sein muss. Physisch werden die Daten als VARCHAR gespeichert.

Ungültiges JSON können Sie zum Beispiel nicht parsen:

SELECT 'unquoted'::JSON;
Terminal window
Conversion Error: Malformed JSON at byte 0 of input: unexpected character. Input: "unquoted"

Stattdessen wollen Sie hier wahrscheinlich SELECT '"quoted"'::JSON.

Da die Daten physisch als VARCHAR gespeichert werden, sind Leerzeichen signifikant:

SELECT '{ "a": 5 }'::JSON = '{"a":5}'::JSON;
false

Beachten Sie, dass Leerzeichen bei Roundtrips erhalten bleiben:

SELECT '{ "a":5 }'::JSON::VARCHAR
{ "a":5 }

Die Reihenfolge der Schlüssel in Objekten ist signifikant:

SELECT '{"a":1,"b":2}'::JSON = '{"b":2,"a":1}'::JSON;
false

Doppelte Schlüssel sind in JSON-Objekten erlaubt:

SELECT '{"a":1,"a":2}'::JSON;
{"a":1,"a":2}

Jeder DuckDB-Typ kann nach JSON gecastet werden und JSON zurück in jeden DuckDB-Typ. Um zum Beispiel JSON in den DuckDB-Typ STRUCT zu casten:

SELECT '{"duck": 42}'::JSON::STRUCT(duck INTEGER);
{'duck': 42}

Und zurück:

SELECT {duck: 42}::JSON;
{"duck":42}

Das gilt für unsere geschachtelten Typen wie im Beispiel, aber auch für nicht geschachtelte Typen:

SELECT '2023-05-12'::DATE::JSON;
"2023-05-12"

Die einzige Ausnahme ist der Cast von VARCHAR nach JSON: Dabei werden die Daten nicht verändert, sondern der Inhalt des VARCHAR als JSON geparst und validiert.