JSON扩展可以在将format
设置为auto
时尝试确定JSON文件的格式。
以下是一些示例JSON文件及其应使用的相应format
设置。
在以下每种情况下,format
设置并不是必需的,因为 DuckDB 能够正确推断它,但为了说明目的,它被包含在内。
这种形式的查询在每种情况下都有效:
SELECT *
FROM filename.json;
格式: newline_delimited
使用 format = 'newline_delimited'
可以解析以换行符分隔的 JSON。
每一行都是一个 JSON。
我们使用示例文件 records.json
,其内容如下:
{"key1":"value1", "key2": "value1"}
{"key1":"value2", "key2": "value2"}
{"key1":"value3", "key2": "value3"}
SELECT *
FROM read_json('records.json', format = 'newline_delimited');
key1 | key2 |
---|---|
value1 | value1 |
value2 | value2 |
value3 | value3 |
格式: array
如果JSON文件包含一个JSON对象数组(无论是否格式化),可以使用array_of_objects
。
为了演示其用法,我们使用示例文件records-in-array.json
:
[
{"key1":"value1", "key2": "value1"},
{"key1":"value2", "key2": "value2"},
{"key1":"value3", "key2": "value3"}
]
SELECT *
FROM read_json('records-in-array.json', format = 'array');
key1 | key2 |
---|---|
value1 | value1 |
value2 | value2 |
value3 | value3 |
格式: unstructured
如果JSON文件包含的不是换行符分隔的JSON或数组,可以使用unstructured
。
为了演示其用法,我们使用示例文件unstructured.json
:
{
"key1":"value1",
"key2":"value1"
}
{
"key1":"value2",
"key2":"value2"
}
{
"key1":"value3",
"key2":"value3"
}
SELECT *
FROM read_json('unstructured.json', format = 'unstructured');
key1 | key2 |
---|---|
value1 | value1 |
value2 | value2 |
value3 | value3 |
记录设置
JSON扩展可以在设置records = auto
时尝试确定JSON文件是否包含记录。
当records = true
时,JSON扩展期望JSON对象,并将JSON对象的字段解包到单独的列中。
继续使用相同的示例文件,records.json
:
{"key1":"value1", "key2": "value1"}
{"key1":"value2", "key2": "value2"}
{"key1":"value3", "key2": "value3"}
SELECT *
FROM read_json('records.json', records = true);
key1 | key2 |
---|---|
值1 | 值1 |
value2 | value2 |
value3 | value3 |
当 records = false
时,JSON 扩展将不会解包顶层对象,而是创建 STRUCT
:
SELECT *
FROM read_json('records.json', records = false);
json |
---|
{'key1': value1, 'key2': value1} |
{'key1': value2, 'key2': value2} |
{'key1': value3, 'key2': value3} |
如果我们有非对象的JSON,例如arrays.json
,这将特别有用:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
SELECT *
FROM read_json('arrays.json', records = false);
json |
---|
[1, 2, 3] |
[4, 5, 6] |
[7, 8, 9] |