# YAML을 JSON으로 — 그리고 JSON을 다시 YAML로

양쪽 방향 모두, 그리고 각 방향이 무엇을 치르는지도 말해 줍니다. 그 어느 것도 남의 서버에 붙여 넣지 않습니다.

> 브라우저에서 YAML을 JSON으로, JSON을 YAML로 바꿉니다. YAML 1.2를 읽어서 yes와 no가 문자열로 남고, 각 방향이 무엇을 잃는지 정확히 말해 줍니다. 아무것도 업로드되지 않아서 설정 파일이 기기를 떠나지 않습니다.

이 페이지는 브라우저 안에서만 동작하는 대화형 도구입니다(https://abox.tools/ko/yaml-json-변환/). 도구에 넘긴 어떤 것도 업로드되지 않습니다. 아래는 이 페이지가 도구에 대해 글로 설명하는 내용 전부입니다. 도구를 쓰려면 이 주소를 여세요.

## YAML과 JSON은 **절대 업로드되지 않습니다**. 서버가 아예 없으니까요.

변환은 문자열에 대한 산술이고, 그 일이 여기, 이 페이지에서 벌어집니다. 두 파서는 모두 손으로 쓴 것이고 `src/`에 있습니다. `shared/parse-yaml.js`와 `shared/parse-json.js`이며, 그 밖에는 아무것도 없습니다. 이 도구에는 네트워크 기능 자체가 없어서 가져올 것도 보낼 것도 없습니다. 그것이 이 사이트의 거의 어느 곳에서보다 여기서 더 무겁습니다. YAML 파일은 대개 배포 설정이고, 배포 설정은 대개 호스트 이름과 버킷 이름과 비밀로 가득하기 때문입니다.

- ✗ 업로드 없음
- ✗ 가입 없음
- ✗ 용량 제한 없음
- ✓ 오프라인 동작
- ✓ 오픈 소스

## YAML을 업로드하지 않고 JSON으로 바꾸는 방법

1. **방향을 고르세요.** *YAML에서 JSON으로* 또는 *JSON에서 YAML로*. 메뉴 아래의 설명이 그 방향에서 무엇을 잃는지, 무언가를 붙여 넣기 전에 말해 줍니다. 붙여 넣은 뒤가 아니라요.
2. **붙여 넣거나, 파일을 놓으세요.** 선택해서 복사할 수 있는 것이면 무엇이든 됩니다. 선택기에 놓은 파일은 사용자의 브라우저가 읽어서 입력란에 넣습니다. 건너뛸 업로드 단계 자체가 없고, `.json`이나 `.yaml` 확장자면 방향까지 알아서 정해집니다.
3. **들여쓰기를 고르세요.** 공백 두 칸, 네 칸, 또는 탭. 탭은 JSON에만 제공됩니다. YAML은 공백을 기준으로 정의되어 있고, 그 안에서 탭은 올바른 들여쓰기가 아닙니다.
4. **오류가 있는 자리에서 오류를 읽으세요.** 여기서 실패한 파서는 ‘4193번 위치에 예기치 않은 토큰’ 대신, 무엇을 만났는지를 몇 행 몇 열인지와 함께 말해 줍니다. 대개 그것만으로 다른 것을 열지 않고도 설정 파일을 고칠 수 있습니다.
5. **결과를 가져가세요.** 복사하거나, 나온 형식의 이름이 붙은 파일로 내려받으세요.

## 상자 속 다른 도구

- [XML 포맷터](https://abox.tools/ko/xml-포맷터/): 읽으라고 펼친 XML, 보내라고 납작하게 누른 XML, 그리고 양쪽으로 오가는 JSON 변환. 그 어느 것도 남의 서버에 붙여 넣지 않습니다.
- [텍스트 비교](https://abox.tools/ko/텍스트-비교/): 두 텍스트를 넣으면 모든 차이가 줄 단위, 단어 단위로 표시됩니다. 남의 서버에 붙여 넣는 것은 없습니다.
- [Base64 인코더 · 디코더](https://abox.tools/ko/base64-인코딩/): Base64, 퍼센트 인코딩, HTML 엔티티, 16진수, 역슬래시 이스케이프를 양방향으로. 남의 서버에 붙여 넣는 것은 없습니다.
- [텍스트·파일 공유](https://abox.tools/ko/텍스트-공유/): 공유는 이 열린 탭 안에서만 삽니다. 읽는 사람은 암호화된 내용을 당신의 브라우저에서 직접 받아 가고, 탭을 닫으면 끝납니다 - 어떤 서버에도 아무것도 남지 않습니다.

## 자주 묻는 질문

### 제 YAML이 어딘가로 업로드되나요?

아닙니다. 이 페이지의 두 파서와 두 프린터는 사용자의 브라우저에서, 사용자의 하드웨어 위에서 도는 함수입니다. 이 도구에는 네트워크 기능 자체가 없어서 무언가를 가져오지도, 보내지도 않습니다. 페이지의 `Content-Security-Policy`에는 연결할 수 있는 모든 주소가 적혀 있고 그중 우리 것은 하나도 없습니다. 배포 설정에 이것을 쓰는 이유가 바로 그것입니다. 그런 파일은 호스트 이름과 버킷 이름으로, 가끔은 누군가 옮기려던 비밀로 가득하고, 그것을 남의 변환기에 붙여 넣는 것은 그 사람에게 주는 일입니다.

### YAML을 JSON으로 바꾸면 무엇을 잃나요?

주석입니다. JSON에는 그것을 둘 자리가 없습니다. 앵커와 별칭과 태그는 짐작되는 대신 아예 거절됩니다. 저마다 JSON이 말할 수 없는 것을 말하고 있고, 조용히 해석 하나를 고른 변환기라면 파일이 말한 것이 아닌 문서를 건네줄 테니까요. 반대 방향은 아무것도 잃지 않습니다. 모든 JSON 문서는 이미 YAML 문서입니다.

### 제 YAML에는 no라고 썼는데 JSON은 문자열로 나왔습니다. 왜죠?

그것이 문자열이고, 여기서는 1.1이 아니라 YAML 1.2를 읽기 때문입니다. YAML 1.1에서는 `yes`, `no`, `on`, `off`가 불리언이었고, 그것이 노르웨이의 국가 코드를 `false`로 바꿔 버리는 그 유명한 버그입니다. YAML 1.2가 그것을 버렸고 여기서도 버렸습니다. 텍스트가 아닌 것으로 읽히는 것은 `true`, `false`, `null`, `~`뿐입니다. 반대 방향에서는 그 낱말들을 *따옴표를 붙여* 되돌려 씁니다. 여기서는 따옴표가 없어도 텍스트로 읽겠지만, 그 파일을 다음에 여는 것은 그러지 않을 수도 있기 때문입니다. PyYAML은 아직도 1.1이 기본입니다. 엄격하게 읽고 조심스럽게 쓰는 것이 양쪽 모두에서 옳은 유일한 조합입니다.

### 키의 순서를 지켜 주나요?

네, 양쪽 방향 모두입니다. 그리고 그것은 들리는 것보다 어렵습니다. `JSON.parse` 위에 세운 변환기는 정수처럼 보이는 키를 조용히 앞으로 옮겨서, `{"10":a,"2":b}`가 `{"2":b,"10":a}`로 돌아옵니다. 숫자는 입력하신 자릿수를 그대로 지켜서, 스무 자리 계좌 아이디가 마지막 세 자리를 double에 빼앗기지 않습니다. 정렬을 *원하시면* 체크박스가 있고, 코드 포인트가 아니라 키가 읽히는 방식에 따라 정렬합니다.

### 여러 YAML 문서를 한 번에 바꿀 수 있나요?

아닙니다. 하나를 골라 버리는 대신 그렇다고 말합니다. `---` 구분자가 있는 파일은 문서를 하나보다 많이 담고 있고, JSON에는 ‘여러 문서’를 뜻하는 모양이 없습니다. 배열로 만들면 파일이 한 적 없는 주장을 하는 셈이 됩니다. 하나씩 바꾸세요.

### 여기에는 왜 YAML 포맷터가 없나요?

YAML에는 쓸 만한 압축 형태가 없기 때문입니다. 짧은 쪽은 플로 스타일인데 읽을 수가 없고, 읽을 수 없다는 것은 파일을 YAML로 두는 이유의 정반대입니다. JSON, XML, HTML, CSS를 펼치는 일은 [JSON 포맷터](https://abox.tools/ko/json-포맷터/)의 몫이고, 그쪽은 YAML도 펼칩니다.

### 얼마나 큰 파일까지 다룰 수 있나요?

여기에 걸어 둔 제한은 없습니다. 그 값을 치를 서버가 없기 때문입니다. 실제 한계는 사용자의 기기입니다. 몇 메가바이트짜리 YAML은 괜찮고, 아주 긴 문서에서는 키보드를 두고 다투는 대신 입력이 멎기를 기다렸다가 변환합니다.

### 무료인가요? 가입해야 하나요?

무료이고 계정도, 로그인도, 체험 기간도 없으며 얼마나 붙여 넣든 제한이 없습니다. 이 사이트에는 광고가 있고 그것이 비용을 댑니다. 광고에는 텍스트에 관한 것이 아무것도 주어지지 않습니다.

### 오프라인에서도 되나요?

됩니다. 페이지를 한 번 불러온 뒤 인터넷을 끊어도 계속 동작합니다. 이것이 아무것도 업로드되지 않는다는 가장 간단한 증명이기도 합니다. 설정을 변환하러 밖으로 보내는 도구라면 선을 뽑는 순간 멈췄을 것입니다.

## 이 약속을 직접 확인하는 방법

- **붙여 넣은 것이 나갈 곳이 없습니다.** Content-Security-Policy에는 이 페이지가 연결할 수 있는 모든 주소가 적혀 있고, 그중 우리 것은 하나도 없습니다. 붙여 넣은 설정이 수집될 만한 엔드포인트가 여기에는 없고, 설령 있다 해도 그리로 보낼 코드가 없습니다.
- **여기서는 아무것도 가져오지 않습니다.** `src/` 어디에도 `fetch`도, `XMLHttpRequest`도, `sendBeacon`도 없습니다. 두 파서와 두 프린터는 문자열을 받아 문자열을 돌려주는, 이 페이지 안의 함수입니다.
- **YAML 1.2를 읽어서, 노르웨이는 그대로 노르웨이입니다.** YAML 1.1에서는 `no`가 불리언이었고, 그것이 노르웨이의 국가 코드를 `false`로 바꿔 버리는 그 유명한 버그입니다. 여기서 읽는 것은 1.2이고, 거기서 그것은 보이는 그대로의 문자열입니다. 반대 방향에서는 그 낱말들을 *따옴표를 붙여* 되돌려 씁니다. 그 파일을 다음에 여는 것이 아직 1.1 리더일 수 있기 때문입니다. `tests/js/text-convert.test.js`가 양쪽을 모두 확인합니다.
- **정직할 수 없는 변환은 대신 멈춥니다.** YAML 안의 앵커나 별칭, 태그는 조용히 다른 뜻이 되는 JSON 문서를 내놓는 대신, 그것이 몇 번째 줄에 있는지 알려 주며 변환을 끝냅니다. JSON에는 ‘같은 노드를 두 번’이라고 말할 방법이 없고, 해석 하나를 고르는 것은 사용자 대신 정해 버리는 일입니다.
- **구글이 불러오는 것과, 구글에 주지 않는 것.** 광고와 측정 스크립트는 구글에서, 후원 버튼은 Buy Me a Coffee에서 옵니다. 그 어느 쪽에도 사용자의 텍스트는 한 글자도 건네지지 않습니다. 그것을 읽고 파싱하고 쓰는 모든 줄은 이 오리진에서 제공되며 저장소에 올라 있습니다.
- **오프라인에서 동작합니다.** 네트워크를 끊어도 이 도구는 그대로입니다. 애초에 네트워크 단계가 없었기 때문입니다. 가장 간단한 증명입니다.

**직접 확인해 보세요.** 위에 적은 어느 것도 그냥 믿으실 필요는 없습니다. 이 페이지는 저장소 안의 템플릿과 설정을 빌드 스크립트가 찍어 낸 결과이고, 그 스크립트는 누구나 읽고 직접 돌려 볼 수 있습니다. 결과물은 `dist` 브랜치에 그대로 올라가 있고요. 그래서 실제로 제공되는 파일과 소스를 빌드한 결과를 나란히 놓고 비교해 보실 수 있습니다: https://github.com/A-Box-of-Tools/website

먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 `config/site.toml`, 앵커가 무슨 뜻이었는지 짐작하는 대신 거절하는 리더는 `src/shared/parse-yaml.js`를, 변환이 왜 두 형식을 동시에 아는 무언가가 사이에 끼지 않은 파서 하나와 프린터 하나인지는 `src/convert.js`를 보세요.
