유형 키를 기반으로 동적 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!