> 백엔드 개발 > Golang > 알 수 없는 Go 구조체의 JSON 출력에 필드를 동적으로 추가하는 방법은 무엇입니까?

알 수 없는 Go 구조체의 JSON 출력에 필드를 동적으로 추가하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-04 15:31:12
원래의
714명이 탐색했습니다.

How to Dynamically Add Fields to JSON Output from Unknown Go Structs?

알 수 없는 구조체의 JSON 출력을 동적으로 향상

소개
Go에서는 알려진 구조체를 익명 필드로 삽입하여 JSON 출력합니다. 그러나 이 기술은 특정 유형에서만 작동합니다. 이 문서에서는 이 기능을 알 수 없는 구조체 또는 인터페이스로 확장하는 방법을 살펴봅니다.


다음 예를 고려하세요.

type example interface{}
type Data struct {
    Name string
}

func printInterface(val interface{}) {
    example1 := struct {
        example
        Extra string
    }{
        example: val,
        Extra: "text",
    }
    json.NewEncoder(os.Stdout).Encode(example1)
}

func main() {
    d := Data{Name: "name"}
    printInterface(&d)
}
로그인 후 복사

이 코드는 다음 JSON을 인쇄합니다. :

{"example":{"Name":"name"},"Extra":"text"}
로그인 후 복사

"이름" 필드가 불필요한 "예제" 안에 어떻게 포함되어 있는지 확인하세요. object.

해결책 1: 리플렉션을 사용하여 동적 유형 생성
"예제" 개체를 피하려면 런타임에 동적 유형을 생성해야 합니다. 리플렉션을 사용하여 알 수 없는 인터페이스를 포함하고 추가 "Extra" 필드를 포함하는 구조체 유형을 생성할 수 있습니다.

func printInterface(val interface{}) {
    t2 := reflect.StructOf([]reflect.StructField{
        {
            Name:      "X",
            Anonymous: true,
            Type:      reflect.TypeOf(val),
        },
        {
            Name: "Extra",
            Type: reflect.TypeOf(""),
        },
    })

    v2 := reflect.New(t2).Elem()
    v2.Field(0).Set(reflect.ValueOf(val))
    v2.FieldByName("Extra").SetString("text")

    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
로그인 후 복사

이 변경으로 인해 출력은 다음과 같습니다.

{"Name":"name","Extra":"text"}
로그인 후 복사

해결책 2: 마샬링 및 역마샬링
대체 접근 방식은 인터페이스를 마샬링하는 것입니다. 이를 맵으로 역마샬링하고 추가 필드를 추가한 다음 다시 마샬링합니다.

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

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

    v2["Extra"] = "text"
    return json.NewEncoder(os.Stdout).Encode(v2)
}
로그인 후 복사

이 방법은 동적 유형 접근 방식과 동일한 출력을 생성합니다.

결론
여기에 제시된 두 솔루션 모두 알 수 없는 구조체 또는 인터페이스에 대한 임의 필드를 사용하여 JSON 출력을 확장할 수 있습니다. 리플렉션 기반 접근 방식은 형식이 안전한 솔루션을 제공하는 반면 마샬링 및 역마샬링 기술은 더 간단하지만 잠재적으로 느릴 수 있습니다. 방법 선택은 애플리케이션의 특정 요구 사항에 따라 다릅니다.

위 내용은 알 수 없는 Go 구조체의 JSON 출력에 필드를 동적으로 추가하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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