본문으로 건너뛰기
🛠️ToolsShed

JSON to Go 구조체

JSON 데이터를 Go 구조체 타입으로 변환합니다.

이 도구 소개

JSON to Go Struct는 JSON 데이터를 Go 언어의 구조체 정의로 자동 변환하는 개발자 유틸리티입니다. 이 도구는 JSON API나 설정 파일을 다루는 Go 개발자에게 필수적이며, 구조체 필드와 해당하는 JSON 태그를 수동으로 정의하는 번거로운 과정을 크게 줄여줍니다.

JSON 데이터를 도구에 붙여넣기만 하면 적절한 필드 타입, 이름, 구조체 태그(json, omitempty 등)가 포함된 Go 구조체 코드가 즉시 생성됩니다. 생성된 구조체는 원본 JSON 구조를 유지하면서 Go의 타입 안전성을 보장하여, JSON 응답을 타입이 지정된 데이터 구조로 직접 파싱할 수 있습니다.

이 도구는 외부 API를 통합하거나 복잡하고 깊게 중첩된 스키마의 서드파티 JSON 데이터를 처리할 때 특히 유용합니다. 선택적 필드, 배열, 중첩 객체, 특수 데이터 타입을 지원하여 API 통합 시 개발 시간을 절약하고 타입 불일치로 인한 런타임 오류를 줄입니다.

자주 묻는 질문

코드 구현

import json

def to_pascal_case(s: str) -> str:
    return ''.join(word.capitalize() for word in s.replace('-', '_').split('_'))

def json_to_go_type(value, field_name: str, structs: dict) -> str:
    if value is None:
        return "interface{}"
    if isinstance(value, bool):
        return "bool"
    if isinstance(value, int):
        return "int64"
    if isinstance(value, float):
        return "float64"
    if isinstance(value, str):
        return "string"
    if isinstance(value, list):
        if not value:
            return "[]interface{}"
        elem_type = json_to_go_type(value[0], field_name, structs)
        return f"[]{elem_type}"
    if isinstance(value, dict):
        struct_name = to_pascal_case(field_name)
        fields = []
        for k, v in value.items():
            field_type = json_to_go_type(v, k, structs)
            go_name = to_pascal_case(k)
            fields.append(f'\t{go_name} {field_type} `json:"{k}"`')
        structs[struct_name] = "type " + struct_name + " struct {\n" + "\n".join(fields) + "\n}"
        return struct_name
    return "interface{}"

def json_to_go(json_str: str, root_name: str = "Root") -> str:
    data = json.loads(json_str)
    structs = {}
    json_to_go_type(data, root_name, structs)
    return "\n\n".join(structs.values())

sample = '{"name": "Alice", "age": 30, "address": {"city": "Tokyo", "zip": "100-0001"}}'
print(json_to_go(sample))

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.