📝 TOML ⇔ JSON / YAML 변환기
TOML과 JSON / YAML을 양방향 변환. Hugo config.toml, Cargo.toml, pyproject.toml 편집에 최적.
🔒 개인정보 보호
- ・모든 처리는 브라우저 내에서 완료됩니다
- ・입력 데이터는 서버로 전송되지 않습니다
복사되었습니다
📖 자주 걸리는 지점
TOML 을 JSON 또는 YAML 로, 그 반대 방향으로도 변환합니다. Cargo.toml · pyproject.toml · Hugo 의 config.toml 같은 설정 파일을 읽어 내는 데 쓸 수 있습니다. 처리는 브라우저 안에서 끝납니다. TOML 은 사람이 손으로 쓰고 사람이 읽는 설정 파일을 위해 설계된 형식이지 데이터 교환을 위한 형식이 아닙니다 — 그 때문에 JSON 이나 YAML 사이에는 메울 수 없는 차이가 몇 가지 있습니다.
| 사례 | 무슨 일이 일어나는가 | 어떻게 하면 되는가 |
|---|---|---|
| JSON 에서 TOML 로 변환할 수 없는 값이 있다 | TOML 에는 null 이 없습니다. 이는 구현의 사정이 아니라 사양상의 판단으로 설정 파일에서 값이 없다는 그 키를 쓰지 않는 것으로 표현해야 한다는 설계 사상에 따릅니다. 따라서 {"timeout": null} 은 TOML 로는 표현할 수 없습니다. 같은 이유로 타입이 섞인 배열([1, "two", true])도 많은 구현이 받아들이지 않습니다 — TOML 1.0 에서는 허용되어 있지만 파서의 대응이 제각각입니다. API 의 응답을 그대로 TOML 로 만들려고 하면 우선 이 두 가지에서 막힙니다. |
null 인 키는 변환 전에 제거하세요 — TOML 의 설계 사상에 맞춘다면 이것이 올바른 대응입니다. 값이 없음을 명시하고 싶다면 빈 문자열이나 false 같은 그 키에 있어 의미 있는 기본값을 넣습니다. 애초에 TOML 을 데이터 교환에 쓰지 마세요 — 용도가 다릅니다. TOML 이 맞는 것은 사람이 손으로 편집하고 차분을 리뷰하는 설정 파일이며 기계가 생성하고 기계가 읽는 데이터에는 JSON 이 적합합니다. 이 구조는 TOML 로 쓰기 어렵다고 느꼈다면 그것은 설정으로서 너무 복잡하다는 신호일지도 모릅니다 — 중첩이 3 단을 넘으면 설계를 재검토할 가치가 있습니다. |
| 같은 구조인데 변환 결과가 손으로 쓴 것과 달라 보인다 | TOML 은 같은 데이터를 세 가지 작성법으로 표현할 수 있습니다 — 테이블 헤더 [server], 테이블의 배열 [[bin]], 그리고 인라인 테이블 { host = "x", port = 80 } 입니다. 변환기는 그중 하나를 골라 출력하므로 손으로 쓴 것과 구조는 같아도 겉모습이 전혀 다를 수 있습니다. 혼란의 원인이 되기 쉬운 것이 테이블 헤더의 위치로 정해지는 성질로 [server] 라고 쓴 뒤의 키는 모두 server 에 속합니다 — 행의 순서가 의미를 가지므로 키를 한 줄 옮기는 것만으로 속하는 테이블이 바뀝니다. |
변환 결과는 어느 것이나 올바른 TOML 입니다 — 손으로 쓴 겉모습에 맞추고 싶다면 변환 결과를 출발점으로 삼아 손으로 다듬는 수밖에 없습니다. 그리고 기존 설정 파일을 이 도구로 왕복시키지 마세요 — 결정적인 이유는 주석이 완전히 사라진다는 것입니다. JSON 에는 주석의 개념이 없으므로 Cargo.toml 이나 pyproject.toml 을 JSON 을 거쳐 정형하면 왜 이 의존을 핀 고정하고 있는가 같은 그 파일에서 가장 가치 있는 정보가 통째로 사라집니다. 이 도구는 읽어 내기 위해 쓰고 편집은 원래 파일에 직접 하세요. |
| 날짜가 문자열이 된다 · 문자열이 날짜가 된다 | TOML 은 날짜 시각을 일급 타입으로 갖고 있습니다 — created = 1979-05-27T07:32:00Z 는 따옴표 없이 쓸 수 있고 이는 문자열이 아니라 일시의 값입니다. JSON 에는 이 타입이 없으므로 변환하면 ISO 8601 의 문자열이 됩니다. 여기까지는 자연스러운 변환이지만 역방향이 문제입니다 — JSON 의 "2024-01-01" 을 TOML 로 되돌리면 구현에 따라서는 따옴표가 벗겨져 날짜 타입이 되고 의미가 바뀝니다. 버전의 날짜나 날짜 모양의 ID("2024-01-01" 이라는 릴리스 이름 등)를 다루고 있으면 왕복시킨 것만으로 타입이 바뀌어 버립니다. |
날짜 모양의 문자열을 다룬다면 왕복시키지 마세요. 부득이한 경우에는 변환 후의 TOML 을 눈으로 보고 의도한 쪽에 따옴표가 붙어 있는지를 확인하세요 — created = 2024-01-01 은 날짜, created = "2024-01-01" 은 문자열이며 이 한 쌍의 따옴표가 타입을 정하고 있습니다. 설계 단계에서 이를 피하고 싶다면 날짜로 다루고 싶지 않은 값에 접두사를 붙이는 것이 유효합니다("v2024-01-01" 처럼). TOML 의 일시 타입에는 로컬 날짜 · 로컬 시각 · 오프셋 붙은 일시의 세 종류가 있고 각각 의미가 다릅니다 — 타임존 정보가 필요한 값에는 반드시 오프셋을 쓰세요. |
설정 파일에는 구조뿐 아니라 약속이 있습니다. pyproject.toml 의 키 이름은 PEP 518 과 PEP 621 로 정해져 있어 [project] 나 [build-system] 의 구조를 바꾸면 pip install -e . 가 통하지 않게 됩니다. Cargo.toml 도 마찬가지로 [[bin]] 은 테이블의 배열이어야 하며 [bin] 이라고 쓰면 다른 의미가 됩니다. 따라서 이 도구는 남이 쓴 설정 파일의 구조를 읽어 내기 위해 쓰는 것이 본래의 용도이며 정형이나 다시 쓰기의 경로로 쓰는 것이 아닙니다. 한 가지 더, TOML 에는 YAML 같은 앵커나 참조의 구조가 없습니다 — 같은 값을 여러 곳에 써야 하고 그것이 장황해 보일 수 있지만 이는 설정 파일은 위에서 순서대로 읽어 이해할 수 있어야 한다는 설계 판단의 결과입니다. 공통화하고 싶다면 TOML 안에서 해결하려 하지 말고 생성하는 쪽의 스크립트에서 해결하세요.
📖 사용법
-
1
TOML 붙여넣기왼쪽에 TOML을 붙여넣거나 샘플을 선택하세요.
-
2
대상 형식 선택JSON 또는 YAML 선택. JSON은 들여쓰기 폭 지정 가능.
-
3
양방향 변환오른쪽에 결과 표시. 역방향도 실시간 변환.
❓ 자주 묻는 질문
TOML이란?
날짜와 시간 처리는?
YAML/JSON에서 TOML로도 가능한가요?
🔗 관련 도구
🐛 이 도구에서 문제가 발생했나요?
무료 · 가입 불필요. 재현 절차만이라도 도움이 됩니다. 보고는 운영자에게 직접 전달되어 개선에 사용됩니다.
보고 감사합니다!
운영자에게 전달되었습니다. 개선에 사용됩니다.