상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - Go에서 커스텀 JSON 직렬화 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Go에서 커스텀 JSON 직렬화를 구현하는 방법은 `encoding/json` 패키지를 활용하여 <a href='https://sangseek.com/sangseeks/구조체/ko'>구조체</a>의 필드를 JSON으로 변환하는 방식을 제어하는 것입니다. Go의 JSON 직렬화는 기본적으로 구조체의 필드 이름을 JSON 키로 사용하지만, 커스텀 직렬화를 통해 더 복잡한 요구사항을 충족할 수 있습니다. 1. 기본 JSON 직렬화 Go에서 구조체를 JSON으로 직렬화하려면 `json.Marshal` 함수를 사용합니다. 기본적인 예시는 다음과 같습니다: ```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { p := Person{Name: "Alice", Age: 30} jsonData, err := json.Marshal(p) if err != nil { fmt.Println(err) } fmt.Println(string(jsonData)) // {"name":"Alice","age":30} } ``` 2. 커스텀 JSON 직렬화 커스텀 직렬화를 위해서는 `json.Marshaler` 인터페이스를 구현해야 합니다. 이 인터페이스는 `MarshalJSON` 메서드를 정의해야 하며, 이 메서드 내에서 원하는 형식으로 JSON을 생성할 수 있습니다. 예제: 커스텀 직렬화 다음은 `Person` 구조체를 커스텀 직렬화하는 예제입니다. 여기서는 `Age` 필드를 JSON에 포함하지 않고, `Name` 필드를 대문자로 변환하여 직렬화합니다. ```go package main import ( "encoding/json" "fmt" "strings" ) type Person struct { Name string Age int } // MarshalJSON 메서드를 구현하여 커스텀 직렬화를 정의합니다. func (p Person) MarshalJSON() ([]byte, error) { type Alias Person // Alias를 사용하여 무한 루프를 방지합니다. return json.Marshal(<a href='https://sangseek.com/sangseeks/&str/ko'>&str</a>uct { Name string `json:"name"` // Age 필드는 포함하지 않음 }{ Name: strings.ToUpper(p.Name), // 이름을 대문자로 변환 }) } func main() { p := Person{Name: "Alice", Age: 30} jsonData, err := json.Marshal(p) if err != nil { fmt.Println(err) } fmt.Println(string(jsonData)) // {"name":"ALICE"} } ``` 3. 커스텀 JSON 역직렬화 역직렬화(디코딩)도 커스텀 방식으로 구현할 수 있습니다. 이를 위해 `json.Unmarshaler` 인터페이스를 구현하고 `UnmarshalJSON` 메서드를 정의합니다. 예제: 커스텀 역직렬화 다음은 JSON 데이터를 `Person` 구조체로 역직렬화하는 예제입니다. 여기서는 JSON의 `name` 필드를 소문자로 변환하여 저장합니다. ```go package main import ( "encoding/json" "fmt" "strings" ) type Person struct { Name string Age int } // UnmarshalJSON 메서드를 구현하여 커스텀 역직렬화를 정의합니다. func (p *Person) UnmarshalJSON(data []byte) error { type Alias Person // Alias를 사용하여 무한 루프를 방지합니다. aux := &struct { Name string `json:"name"` Age int `json:"age"` }{ Age: 0, // 기본값 설정 } if err := json.Unmarshal(data, &aux); err != nil { return err } p.Name = strings.ToLower(aux.Name) // 이름을 소문자로 변환 p.Age = aux.Age return nil } func main() { jsonData := []byte(`{"name":"ALICE","age":30}`) var p Person if err := json.Unmarshal(jsonData, &p); err != nil { fmt.Println(err) } fmt.Println(p) // {alice 30} } ``` 4. 결론 Go에서 커스텀 JSON 직렬화 및 역직렬화는 `json.Marshaler`와 `json.Unmarshaler` 인터페이스를 구현함으로써 가능합니다. 이를 통해 JSON 데이터의 형식을 자유롭게 조정할 수 있으며, 특정 요구사항에 맞게 데이터를 변환할 수 있습니다. 이러한 기능은 API와의 상호작용이나 데이터 저장 시 매우 유용하게 사용될 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기