본문으로 건너뛰기

JSON Go 구조체 변환

JSON to Go Structs

JSON 예시로 json 태그가 붙은 Go 구조체를 만들며 중첩·반복 타입도 처리합니다.

예시 문서에서 `json:` 태그가 붙은 Go 구조체를 만듭니다. 응답 본문을 `encoding/json`이 언마셜할 수 있는 형태로 바꿔 줍니다. 필드 이름은 대문자로 export되고 원래 키는 태그에 남습니다. 손으로 쓸 때 가장 자주 틀리는 부분입니다.

🔒 브라우저 안에서만 처리gojsoncodegenstruct
출력 언어

예시 JSON

.json 파일 놓기

이 탭에서 읽습니다. 올라가지 않습니다.

가진 원소를 전부 넣으세요. 레코드가 하나 늘 때마다 추측이 좁아집니다. 어느 하나에 없는 필드가 선택 필드가 되는 근거입니다.

TypeScript

사용 방법

  1. 가진 레코드를 되도록 많이 붙여넣습니다

    배열은 첫 원소만이 아니라 모든 원소를 읽어서 합칩니다. 레코드가 셋이면 하나일 때보다 훨씬 많은 것을 알려 줍니다. 어느 하나에 없는 필드가 바로 그 필드를 선택으로 만드는 근거이기 때문입니다.

  2. 루트 타입 이름을 정합니다

    중첩된 객체는 그것을 담은 키 이름을 따르고, 배열이면 단수형으로 바뀝니다. `users`는 `User`가 됩니다. 이름을 직접 정해야 하는 건 루트뿐입니다.

  3. 출력 아래의 숫자를 확인합니다

    타입 수, 선택 필드 수, 유니온 수, 합친 레코드 수가 나옵니다. 유니온이 0보다 크면 어떤 필드가 표본 안에서 서로 다른 종류의 값을 가졌다는 뜻이니, 결과를 코드베이스에 붙여넣기 전에 한 번 볼 만합니다.

  4. 구조체를 패키지에 붙여넣습니다

    일부 레코드에 없던 필드는 태그에 `,omitempty`가 붙어서, 다시 마셜할 때 없는 값을 만들어 내지 않습니다. package 선언은 내지 않습니다. 어디에 넣을지는 쓰는 사람이 압니다.

자주 묻는 질문

왜 숫자가 전부 float64인가요?

표본에 소수가 있었을 때만 그렇습니다. 문서의 숫자가 전부 정수였다면 정수 타입으로 나옵니다. id로 쓰인 JSON의 `1`과 반올림된 가격의 `1`을 구분할 방법이 없어서, 표본이 가진 근거의 전부입니다.

일부 레코드에서 null인 필드는요?

포인터 타입이 됩니다. Go에서 "없거나 null"과 "0"을 구분하는 방법입니다. 그래서 쓸 때 nil 검사가 필요합니다. 번거롭지만, 대안(조용히 0이나 ""으로 읽히는 값 타입)이 더 나쁩니다.

Go 식별자로 못 쓰는 키는 어떻게 되나요?

필드 이름은 구분자를 없애고 각 조각의 첫 글자를 올려 정리하고, 원래 키는 `json:` 태그에 남습니다. 실제 매칭은 태그가 합니다. `user-id`는 `json:"user-id"`를 달고 `UserId` 꼴이 됩니다.

`time.Time`으로 나오나요?

아니요. JSON의 타임스탬프는 문자열이고, `time.Time`으로 바꾸면 언마셜이 받아들이는 범위가 달라집니다. 원한다면 필드 타입을 손으로 바꾸세요. `encoding/json`은 RFC 3339 문자열을 `time.Time`으로 알아서 파싱합니다.

이 도구로 이어지는 것

다음 단계

이 도구의 결과를 그대로 받을 수 있는 도구들입니다.