JSON 格式设置
当 format 设为 auto 时,JSON 扩展会尝试自动判断 JSON 文件格式。
下面给出一些 JSON 示例文件以及对应可使用的 format 设置。
在下列各个场景中,其实都不必显式设置 format,因为 Goose 能正确自动推断;此处仅为演示而写出。
以下形态的查询在每种场景下都可工作:
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 文件包含“对象数组”(无论是否美化格式),可使用 array。
示例文件 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 文件既不是按行分隔,也不是数组格式,可使用 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 |
records 选项
当 records = auto 时,JSON 扩展会尝试判断文件是否为 records 形式。
当 records = true 时,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 |
|---|---|
| value1 | value1 |
| 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] |