⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
JSON 类型

DuckDB 通过 JSON 逻辑类型支持 json。例如

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

在逻辑上,JSON 类型类似于 VARCHAR,但限制其内容必须是有效的 JSON。在物理存储上,该数据以 VARCHAR 形式存储。

例如,您无法解析无效的 JSON

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

相反,您可能想要的是 SELECT '"quoted"'::JSON

由于数据在物理上存储为 VARCHAR,因此空格是有意义的

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

请注意,在往返转换中会保留空格

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

对象中键的顺序是有意义的

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

JSON 对象中允许存在重复的键

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

我们允许将 DuckDB 的任何类型转换为 JSON,也可以将 JSON 转换回 DuckDB 的任何类型。例如,要将 JSON 转换为 DuckDB 的 STRUCT 类型,请运行

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

以及转回

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

这不仅适用于示例中展示的嵌套类型,也适用于非嵌套类型

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

此行为的唯一例外是从 VARCHARJSON 的转换,它不会改变数据,而是解析并验证 VARCHAR 中的内容是否为 JSON。

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南