> 백엔드 개발 > Golang > Go Structs에서 JSON 태그를 동적으로 수정하는 방법은 무엇입니까?

Go Structs에서 JSON 태그를 동적으로 수정하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-21 16:22:16
원래의
250명이 탐색했습니다.

How to Dynamically Modify JSON Tags in Go Structs?

구조체의 JSON 태그를 동적으로 수정하는 방법

Go에서는 인코딩/json 패키지를 사용하여 구조체를 JSON으로 직렬화할 수 있습니다. 기본적으로 필드 이름은 JSON 키로 사용됩니다. 그러나 json 태그를 사용하여 JSON 키를 사용자 정의할 수 있습니다.

type User struct {
    ID   int64  `json:"id"`
    Name string `json:"first"` // want to change this to `json:"name"`
}
로그인 후 복사

위 예에서 이름 필드의 json 태그는 "first"로 설정됩니다. 즉, 구조체를 JSON으로 마샬링할 때 이름 필드는 JSON 출력에서 ​​"first"로 표시됩니다.

필드의 JSON 키를 동적으로 변경하려면 Reflect 패키지를 사용하여 필드의 태그를 수정하고 해당 값을 수정합니다. 하지만 JSON 태그 값을 직접 설정하는 방법이 내장되어 있지 않습니다.

이러한 한계를 극복하는 한 가지 방법은 사용자 지정 MarshalJSON 방법을 사용하는 것입니다. 이 방법을 사용하면 구조체가 JSON으로 마샬링되는 방식을 제어할 수 있습니다.

func (u *User) MarshalJSON() ([]byte, error) {
    value := reflect.ValueOf(*u)

    // Iterate through all the fields in the struct
    for i := 0; i < value.NumField(); i++ {
        tag := value.Type().Field(i).Tag.Get("json")

        // If the tag is empty, use the field name as the JSON key
        if tag == "" {
            tag = value.Type().Field(i).Name
        }

        // Update the tag with the new value
        value.Type().Field(i).Tag.Set("json", tag)
    }

    return json.Marshal(u)
}
로그인 후 복사

MarshalJSON 메서드에서는 먼저 구조체의 모든 필드를 반복합니다. 각 필드에 대해 JSON 태그를 가져와 태그 변수에 저장합니다. 태그가 비어 있으면 필드 이름을 JSON 키로 사용합니다.

그런 다음 태그 필드에서 Set 메서드를 호출하여 새 JSON 태그 값을 설정합니다.

MarshalJSON을 재정의하여 메서드를 사용하면 구조체 필드의 JSON 태그를 동적으로 수정할 수 있습니다. 이는 특정 조건에 따라 JSON 출력을 사용자 정의해야 할 때 특히 유용합니다.

포함된 필드를 포함하여 구조체의 모든 필드를 반복하려면 StructField 유형의 Embedded 필드를 사용할 수 있습니다.

type User struct {
    // ...
    Another Another `json:",inline"`
}
로그인 후 복사

위의 예에서 Another 구조체는 인라인 태그를 사용하여 User 구조체에 포함됩니다. 이는 Another 구조체의 필드가 User 구조체의 필드와 인라인으로 마샬링된다는 의미입니다.

포함된 필드를 포함하여 User 구조체의 모든 필드를 반복하려면 다음 코드를 사용할 수 있습니다.

for i := 0; i < value.NumField(); i++ {
    if value.Type().Field(i).Anonymous {
        // Iterate through the embedded fields
        innerValue := reflect.ValueOf(value.Field(i).Interface())
        for j := 0; j < innerValue.NumField(); j++ {
            fmt.Println(innerValue.Type().Field(j).Tag.Get("json"))
        }
    }
}
로그인 후 복사

위 내용은 Go Structs에서 JSON 태그를 동적으로 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿