JSON 형식 설정
JSON 형식 설정 (Format Settings)
.json 파일을 불러올 때마다 파일의 구조를 직접 지정해야 한다면 많이 번거롭겠죠. 다행히 DuckDB의 JSON 확장은 format을 auto로 두면 파일 형식을 알아서 판별해요. 이 페이지에서는 JSON 파일이 어떤 형태든 대부분 잘 읽히도록 format 설정 값을 하나씩 살펴볼게요.
아래 예시들은 DuckDB가 이미 형식을 올바르게 추론해서 format 설정이 사실은 필요 없었던 경우예요. 다만 각 형식이 무엇을 의미하는지 보여주기 위해 명시적으로 넣었어요. 어떤 경우든 다음 모양의 쿼리는 그대로 동작해요.
SELECT *
FROM filename.json;
출처: 공식문서
형식: newline_delimited
format = 'newline_delimited'를 지정하면 한 줄에 JSON 객체 하나씩 들어 있는 **개행 구분 JSON(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 객체들의 배열(들여쓰기된 pretty-print든 아니든)이 들어 있다면 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이 개행 구분도 아니고 배열도 아니라면 unstructured를 사용해요. 예제 파일 unstructured.json을 보면, 여러 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 옵션
JSON 확장은 records = auto로 두면 파일이 레코드(객체)로 구성됐는지도 판별해요. records = true면 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면 최상위 객체를 펼치지 않고 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] |
더 알아보기 (Learn more)
- JSON 읽기 함수(
read_json) 전반은 JSON 개요 문서에서 다뤄요.