>백엔드 개발 >Golang >유형 키를 기반으로 Go에서 동적 JSON 필드를 비정렬화하는 방법은 무엇입니까?

유형 키를 기반으로 Go에서 동적 JSON 필드를 비정렬화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-05 20:17:10496검색

How to Unmarshal Dynamic JSON Fields in Go Based on a Type Key?

유형 키를 기반으로 동적 JSON 역마샬링

JSON 구조에 동적 필드가 포함된 경우 복잡한 JSON 데이터를 Go 구조체로 역마샬링하는 것이 어려울 수 있습니다. 다양한 유형의. 이 문서에서는 JSON 필드가 대부분 단순한 값을 보유하지만 때때로 특정 유형 키가 있는 동적 필드가 필드 값 유형을 결정하는 특정 시나리오를 다룹니다.

목표는 동일한 값을 사용하여 Go 구조체를 만드는 것입니다. 동적 필드가 인터페이스 유형으로 표시되는 제공된 JSON 구조를 사용하여 해당 유형에 따라 유연한 처리가 가능합니다.

가능한 솔루션 중 하나는 다음 사용자 정의를 활용합니다. 유형:

type BigStruct struct {
    SomeData     string    `json:"some_data"`
    DynamicField Something `json:"dynamic_field"`
    OtherData    string    `json:"other_data"`
}

type Something interface {
    GetType() string
}

그런 다음 각 동적 필드 유형에 대한 개별 구조체를 만듭니다.

type BaseDynamicType struct {
    Type string `json:"type"`
}

type DynamicTypeA struct {
    BaseDynamicType
    Name string `json:"name"`
}

type DynamicTypeB struct {
    BaseDynamicType
    Address string `json:"address"`
}

func (d *BaseDynamicType) GetType() string {
    return d.Type
}

JSON을 이 구조체로 역마샬링하기 위해 BigStruct는 사용자 정의 UnmarshalJSON 메서드를 구현할 수 있습니다.

func (b *BigStruct) UnmarshalJSON(data []byte) error {
    var tmp struct {
        SomeData     string          `json:"some_data"`
        DynamicField json.RawMessage `json:"dynamic_field"`
        OtherData    string          `json:"other_data"`
    }

    if err := json.Unmarshal(data, &tmp); err != nil {
        return err
    }
    b.Unmarshal(tmp.DynamicField)

    return nil
}

UnmarshalJSON 내에서 Unmarshal 메서드를 호출하여 구문 분석할 수 있습니다. 동적 필드:

func (b *BigStruct) Unmarshal(data json.RawMessage) error {
    switch UnmarshalledType(data) {
    case "A":
        var a DynamicTypeA
        if err := json.Unmarshal(data, &a); err != nil {
            return err
        }

        b.DynamicField = &a
    case "B":
        var b DynamicTypeB
        if err := json.Unmarshal(data, &b); err != nil {
            return err
        }

        b.DynamicField = &b
    }

    return nil
}

func UnmarshalledType(b json.RawMessage) string {
    var typ struct {
        Type string `json:"type"`
    }

    if err := json.Unmarshal(b, &typ); err != nil {
        log.Fatalf("Error extracting type from RawMessage: %v", err)
    }

    return typ.Type
}

이 접근 방식을 사용하면 추가 자리 표시자 필드를 도입하지 않고도 동적 JSON 필드를 Go 구조체로 역마샬링할 수 있습니다.

위 내용은 유형 키를 기반으로 Go에서 동적 JSON 필드를 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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