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;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;falseBeachten 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;falseDoppelte 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.