>백엔드 개발 >Golang >런타임 시 Go 구조체의 JSON 태그를 어떻게 동적으로 변경할 수 있나요?

런타임 시 Go 구조체의 JSON 태그를 어떻게 동적으로 변경할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-21 15:46:10774검색

How Can I Dynamically Change JSON Tags in Go Structs at Runtime?

구조체에서 JSON 태그를 동적으로 변경

문제

중첩된 구조체가 있는 구조체가 제공되고, 목표는 JSON 태그를 동적으로 수정하는 것입니다. JSON 인코딩 전 구조체 내의 특정 필드. 원하는 JSON 출력은 특정 필드 이름을 재정의하는 것입니다.

솔루션

MarshalJSON에서 익명 구조체 사용

In Go 버전 1.8 이상 , 런타임 시 필드의 JSON 태그를 동적으로 변경하는 기술을 사용할 수 있습니다. 여기에는 원래 구조체의 MarshalJSON 메서드 내에서 원하는 필드 태그를 사용하여 익명 구조체를 생성하는 작업이 포함됩니다.

func (u *User) MarshalJSON() ([]byte, error) {
    type alias struct {
        ID   int64  `json:"id"`
        Name string `json:"name"` // The modified JSON tag
        tag  string `json:"-"`
        Another
    }

    var a alias = alias(*u)
    return json.Marshal(&a)
}

여기에서 별칭 구조체에는 User 구조체와 동일한 필드가 있지만 이름 필드에는 원하는 필드가 있습니다. JSON 태그("첫 번째" 대신 "이름"). 별칭 구조체의 JSON 인코딩을 반환하면 JSON 필드 이름을 동적으로 재정의할 수 있습니다.

모든 필드에 대해 반복

내장된 구조체를 포함하여 구조체의 모든 필드를 반복하려면 다음과 같이 패키지를 반영합니다.

value := reflect.ValueOf(*u)
for i := 0; i < value.NumField(); i++ {
    tag := value.Type().Field(i).Tag.Get("json")
    field := value.Field(i)
    fmt.Println(tag, field)
}

이 코드는 내장된 Another 구조체의 필드를 포함하여 모든 필드를 반복하고 JSON을 인쇄합니다. 각 필드의 태그 및 필드 값.

위 내용은 런타임 시 Go 구조체의 JSON 태그를 어떻게 동적으로 변경할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.