>백엔드 개발 >Golang >알 수 없는 Go 구조체에 대한 JSON 출력에 임의 필드를 어떻게 추가할 수 있나요?

알 수 없는 Go 구조체에 대한 JSON 출력에 임의 필드를 어떻게 추가할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-16 06:10:10700검색

How Can I Add Arbitrary Fields to JSON Output for Unknown Go Structs?

알 수 없는 구조체에 대한 JSON 출력 확장

문제:

알 수 없는 구조체 또는 인터페이스를 처리할 때 임의 필드를 JSON 출력은 어려울 수 있습니다. 데모 코드에서는 이 문제를 보여줍니다. 알 수 없는 구조체에 대해 원하는 JSON 출력을 어떻게 복제할 수 있습니까?

해결책 1: 리플렉션을 사용한 동적 유형 생성

한 가지 접근 방식은 리플렉션을 사용하여 런타임에 동적 유형을 생성하는 것입니다. . 이 유형은 래핑된 인터페이스 유형의 익명 필드와 추가 필드가 있는 구조체입니다. 이 동적 유형을 조작하면 원하는 JSON 출력을 얻을 수 있습니다.

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())
}

해결책 2: Marshal-Unmarshal-Marshal

대체 솔루션에는 입력을 마샬링하는 것이 포함됩니다. 값을 맵으로 역마샬링하고 추가 필드를 추가한 후 마샬링합니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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