JSON 형식 설정

JSON 형식 설정 (Format Settings)

.json 파일을 불러올 때마다 파일의 구조를 직접 지정해야 한다면 많이 번거롭겠죠. 다행히 DuckDB의 JSON 확장은 formatauto로 두면 파일 형식을 알아서 판별해요. 이 페이지에서는 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');
key1key2
value1value1
value2value2
value3value3

형식: 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');
key1key2
value1value1
value2value2
value3value3

형식: 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');
key1key2
value1value1
value2value2
value3value3

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);
key1key2
value1value1
value2value2
value3value3

반대로 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 개요 문서에서 다뤄요.