JSON 데이터를 Go 구조체로 역마샬링하는 것은 간단한 작업일 수 있습니다. 그러나 필드 유형이 다양할 수 있는 동적 데이터 구조가 포함된 JSON 문서를 처리할 경우 프로세스가 더욱 복잡해질 수 있습니다. 이 문서에서는 일반 자리 표시자 필드를 도입하지 않고 이 과제에 대한 솔루션을 탐색합니다.
다음 JSON 사양을 고려하세요.
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
{ "some_data": "foo", "dynamic_field": { "type": "B", "address": "Somewhere" }, "other_data": "bar" }
두 JSON 문서 모두 동일한 Go 구조체로 언마샬링되어야 합니다.
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` }
핵심 질문은 다음과 같습니다. Something 유형을 생성하고 비마샬링 논리를 구현하는 방법은 무엇입니까?
해결책에는 Something 유형에 대한 인터페이스를 만드는 것이 포함됩니다.
type Something interface { GetType() string }
다음으로 Something 인터페이스를 구현하는 특정 구조체 유형을 정의합니다.
type BaseDynamicType struct { Type string `json:"type"` } type DynamicTypeA struct { BaseDynamicType Name string `json:"name"` } type DynamicTypeB struct { BaseDynamicType Address string `json:"address"` }
DynamicType 인터페이스 메소드를 사용하면 JSON 데이터를 적절한 구조로 역마샬링할 수 있습니다.
func (d *DynamicType) UnmarshalJSON(data []byte) error { var typ struct { Type string `json:"type"` } if err := json.Unmarshal(data, &typ); err != nil { return err } switch typ.Type { case "A": d.Value = new(TypeA) case "B": d.Value = new(TypeB) } return json.Unmarshal(data, d.Value) }
이 메소드는 JSON 데이터를 검사하고 필요에 따라 TypeA 또는 TypeB 인스턴스를 생성합니다.
마지막으로 BigStruct에 UnmarshalJSON 메서드를 구현합니다. type:
func (b *BigStruct) UnmarshalJSON(data []byte) error { var tmp BigStruct // avoids infinite recursion return json.Unmarshal(data, &tmp) }
이 메서드는 임시 BigStruct 유형을 사용하여 재귀를 방지하고 JSON 데이터의 유형 필드를 기반으로 적절한 DynamicType 유형을 사용하여 동적 필드를 비정렬화할 수 있습니다.
이 솔루션은 추가 일반 자리 표시자 필드 없이 동적 JSON 데이터를 비정렬화하는 깔끔하고 효율적인 방법을 제공합니다. 인터페이스를 사용하고 사용자 정의 UnmarshalJSON 메소드를 구현함으로써 Go 구조체는 JSON 입력의 동적 데이터 구조에 적응할 수 있습니다.
위 내용은 일반 자리 표시자 필드 없이 Go에서 동적 JSON을 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!