> 백엔드 개발 > Golang > 임의의 JSON 필드를 사용하여 알 수 없는 Go 구조체를 확장하는 방법은 무엇입니까?

임의의 JSON 필드를 사용하여 알 수 없는 Go 구조체를 확장하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-03 20:32:41
원래의
252명이 탐색했습니다.

How to Extend Unknown Go Structs with Arbitrary JSON Fields?

임의의 JSON 필드로 알 수 없는 구조체 확장

Go에서 알려진 구조체의 JSON 표현에 추가 필드를 추가하는 것은 익명 구조체. 그러나 알 수 없는 구조체를 처리할 때는 이 접근 방식을 적용할 수 없습니다. 이 기사에서는 이러한 시나리오에서 유사한 기능을 달성하는 방법을 살펴봅니다.

동적 유형 생성을 위한 Reflect 패키지

한 가지 솔루션은 사용자 정의 구조체를 동적으로 생성하기 위해 Reflect 패키지를 활용하는 것입니다. 런타임에 입력합니다. 이 유형에는 래핑된 인터페이스와 동일한 유형의 익명 필드와 추가 "추가" 필드가 포함됩니다. 이를 통해 내장된 구조체 필드를 승격하여 적절한 JSON 표현을 활성화할 수 있습니다.

func printInterface(val interface{}) {
    // Define the new struct type dynamically
    t2 := reflect.StructOf([]reflect.StructField{
        {
            Name:      "X",
            Anonymous: true,
            Type:      reflect.TypeOf(val),
        },
        {
            Name: "Extra",
            Type: reflect.TypeOf(""),
        },
    })

    // Create a new instance of the dynamic type
    v2 := reflect.New(t2).Elem()
    v2.Field(0).Set(reflect.ValueOf(val))
    v2.FieldByName("Extra").SetString("text")

    // Encode the dynamic type's value to JSON
    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
로그인 후 복사

임의 JSON 필드에 대한 이중 마샬링

대체 접근 방식에는 인터페이스 직렬화, 결과 JSON을 맵으로 구문 분석하고 "Extra" 필드를 추가한 다음 수정된 맵을 JSON으로 다시 직렬화합니다. 이 방법은 더 간단하지만 여러 직렬화 단계로 인해 성능 저하가 발생할 수 있습니다.

func printInterface(val interface{}) error {
    // Serialize the interface to JSON
    data, err := json.Marshal(val)
    if err != nil {
        return err
    }

    // Unmarshal the JSON into a map
    v2 := map[string]interface{}{}
    if err := json.Unmarshal(data, &v2); err != nil {
        return err
    }

    // Add the "Extra" field to the map
    v2["Extra"] = "text"

    // Serialize the modified map to JSON
    return json.NewEncoder(os.Stdout).Encode(v2)
}
로그인 후 복사

두 방법 모두 JSON 표현에서 원하는 "추가" 필드를 사용하여 알 수 없는 구조체를 효과적으로 확장하여 구조체를 직접 조작하는 시나리오에 적합합니다. 불가능합니다.

위 내용은 임의의 JSON 필드를 사용하여 알 수 없는 Go 구조체를 확장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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