일반 필드를 도입하지 않고 유형 키를 기반으로 동적 JSON 역마샬링
많은 구조화된 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로 언마샬링되어야 합니다. struct:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` }
문제는 'dynamic_field' 개체 내의 'type' 키를 기반으로 동적 데이터를 수용할 수 있는 'Something' 유형을 정의하는 데 있습니다.
필요를 피하려면 명시적인 '일반' 필드(예: 값, 데이터)의 경우 유형 삽입의 기능을 활용할 수 있으며 인터페이스.
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` } type DynamicType struct { Value interface{} }
'DynamicType' 내에서 '값' 필드는 JSON의 'type' 키를 기반으로 모든 유형의 데이터를 보유할 수 있습니다. 적절한 역마샬링을 용이하게 하기 위해 'DynamicType'에 UnmarshalJSON 메서드를 구현합니다.
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) }
다양한 데이터 유형에 대해 특정 유형을 정의합니다.
type TypeA struct { Name string `json:"name"` } type TypeB struct { Address string `json:"address"` }
이 접근 방식을 사용하면 다음이 가능합니다. 추가 일반 필드 없이 JSON 문서를 역정렬화하여 깔끔하고 확장 가능한 데이터 구조를 유지할 수 있습니다.
위 내용은 일반 필드 없이 유형 키를 기반으로 Go에서 동적 JSON을 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!