JSON to Go Struct - Go 구조체 타입 생성 온라인
JSON을 붙여넣으면 즉시 Go struct 정의를 생성합니다. PascalCase 네이밍, json 태그, 타입 추론 — 100% 브라우저에서 처리, 서버 전송 없음.
자주 묻는 질문
JSON to Go struct 변환기란?
JSON to Go struct 변환기는 JSON 데이터에서 자동으로 Go struct 타입 정의를 생성하는 도구입니다. 필드명, 타입, json struct 태그를 수동으로 작성하는 대신 샘플 JSON 객체를 붙여넣으면 도구가 모든 필드에 대해 올바른 Go 타입을 추론합니다. 중첩 객체는 별도 struct로, 배열은 슬라이스로 처리하며, 마샬링/언마샬링을 위한 적절한 `json:"field_name"` struct 태그를 생성합니다.
JSON에서 Go struct를 어떻게 생성하나요?
왼쪽 입력 필드에 JSON 데이터를 붙여넣기만 하면 됩니다. 도구가 즉시 오른쪽 출력 패널에 Go struct 정의를 생성합니다. 루트 struct 이름 설정, struct 태그에 omitempty 토글, 인라인 또는 분리 중첩 struct 선택, nullable 필드에 포인터 타입 활성화 등으로 출력을 커스터마이즈할 수 있습니다. 만족스러우면 '복사'를 클릭하여 생성된 코드를 클립보드에 복사하세요.
Go struct 태그에서 omitempty는 무엇인가요?
json struct 태그의 `omitempty` 옵션은 Go의 JSON 인코더에게 필드가 제로 값(빈 문자열, 0, false, nil 포인터, 빈 슬라이스, 빈 맵)일 때 출력에서 해당 필드를 생략하라고 지시합니다. 예를 들어 `json:"name,omitempty"`로 태그된 필드는 이름이 빈 문자열이면 JSON 출력에 나타나지 않습니다. 명시적으로 설정된 필드만 보내려는 API 요청에 유용합니다.
인라인과 분리 struct 중 어떤 것을 사용해야 하나요?
분리 struct(기본값)는 각 중첩 객체에 대해 이름이 있는 타입을 생성하여 코드베이스 전체에서 재사용할 수 있게 합니다. 예를 들어 JSON에 'address' 하위 객체가 있는 'user' 객체가 있으면 'User' struct와 'Address' struct를 모두 생성합니다. 인라인 struct는 타입 정의를 직접 내장하여 더 간결하지만 재사용할 수 없습니다. 프로덕션 코드에는 분리 struct를, 빠른 프로토타이핑이나 일회성 스크립트에는 인라인 struct를 사용하세요.
이 도구를 사용할 때 JSON 데이터가 안전한가요?
네, 완전히 안전합니다. 이 도구는 클라이언트 사이드 JavaScript를 사용하여 브라우저에서 모든 것을 처리합니다. JSON 데이터가 컴퓨터를 떠나지 않으며, 서버 업로드, API 호출, 데이터 저장이 없습니다. 민감한 API 응답, 독점 데이터 스키마, 내부 마이크로서비스 계약, 기밀 설정 파일에 안전하게 사용할 수 있습니다.
Go 네이밍 컨벤션은 어떻게 처리되나요?
도구는 Effective Go의 공식 네이밍 컨벤션을 따릅니다. JSON 필드명은 내보내기용 struct 필드를 위해 PascalCase로 변환됩니다 (예: 'user_name'은 'UserName'이 됩니다). 일반적인 약어는 올바르게 대문자화됩니다: 'id'는 'ID', 'url'은 'URL', 'http'는 'HTTP', 'api'는 'API'가 됩니다. 원래 JSON 키는 올바른 JSON 마샬링을 위해 struct 태그에 보존됩니다.
nullable 필드에 포인터 타입을 언제 사용해야 하나요?
제로 값과 부재/null 값을 구분해야 할 때 포인터 타입을 사용하세요. 예를 들어 포인터 없이는 JSON에서 누락된 'age' 필드가 0(int의 제로 값)으로 언마샬되어, 나이가 실제로 0인지 단순히 제공되지 않은 것인지 알 수 없습니다. 포인터 타입(*int)을 사용하면 누락된 필드는 nil이 됩니다. null을 사용하여 선택적 또는 부재 데이터를 나타내는 API로 작업할 때 '포인터 타입' 옵션을 활성화하세요.
코드 예제
// JSON to Go struct generator
function jsonToGoStruct(json, rootName = 'AutoGenerated') {
const structs = [];
const abbreviations = new Set([
'id', 'url', 'http', 'api', 'html', 'json', 'xml', 'sql',
'ssh', 'tcp', 'udp', 'ip', 'dns', 'uid', 'uuid', 'cpu',
]);
function toGoName(key) {
return key.split(/[-_\s]+/).map(word => {
if (abbreviations.has(word.toLowerCase())) {
return word.toUpperCase();
}
return word.charAt(0).toUpperCase() + word.slice(1);
}).join('');
}
function inferType(value, name) {
if (value === null) return 'interface{}';
if (typeof value === 'boolean') return 'bool';
if (typeof value === 'number') {
return Number.isInteger(value) ? 'int' : 'float64';
}
if (typeof value === 'string') return 'string';
if (Array.isArray(value)) {
if (value.length === 0) return '[]interface{}';
return '[]' + inferType(value[0], name + 'Item');
}
if (typeof value === 'object') {
const structName = toGoName(name);
const fields = Object.entries(value).map(([key, val]) => {
const goType = inferType(val, key);
const goName = toGoName(key);
return `\t${goName} ${goType} \`json:"${key}"\``;
});
structs.push(`type ${structName} struct {\n${fields.join('\n')}\n}`);
return structName;
}
return 'interface{}';
}
const parsed = JSON.parse(json);
inferType(parsed, rootName);
return structs.reverse().join('\n\n');
}
// Example usage
const json = '{"user_id": 1, "user_name": "alice", "address": {"city": "NYC"}}';
console.log(jsonToGoStruct(json));
// Output:
// type Address struct {
// City string `json:"city"`
// }
//
// type AutoGenerated struct {
// UserID int `json:"user_id"`
// UserName string `json:"user_name"`
// Address Address `json:"address"`
// }