>백엔드 개발 >Golang >Go에서 임베디드 유형 키를 사용하여 동적 JSON을 역정렬화하는 방법은 무엇입니까?

Go에서 임베디드 유형 키를 사용하여 동적 JSON을 역정렬화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-08 01:48:16602검색

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

내장 유형 키를 사용하여 동적 JSON 역마샬링

Go에서는 JSON 데이터를 동적 유형 필드가 있는 구조체로 역마샬링할 수 있습니다. 도전적이다. 이 문서에서는 이를 달성하기 위해 사용자 정의 구조체와 내장형 키를 활용하는 솔루션을 살펴봅니다.

문제 설명

다음 JSON 구조를 고려하세요.

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}

우리는 이 JSON을 인터페이스 유형 Something의 DynamicField 필드가 있는 Go 구조체로 역마샬링하려고 합니다. JSON의 유형 키 값에 따라 DynamicField는 DynamicTypeA 또는 DynamicTypeB에 해당해야 합니다.

해결책

이 문제를 해결하기 위해 다음 사용자 정의를 정의합니다. 구조체:

type Something interface {
  GetType() string
}

type DynamicType struct {
  Type   string      `json:"type"`
  Value  interface{} `json:"-"` // Not exported
}

DynamicType은 실제 필드를 결정하기 위해 Type 키가 포함된 동적 필드를 나타냅니다. 데이터의 유형. 직접 액세스를 방지하기 위해 값 필드를 내보내지 않습니다.

다음으로 JSON을 나타내기 위해 Go 구조체를 정의합니다.

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

마지막으로 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(DynamicTypeA)
  case "B":
    d.Value = new(DynamicTypeB)
  }
  return json.Unmarshal(data, d.Value)
}

이 메서드는 유형 키를 비정렬화한 다음 적절한 구조체(DynamicTypeA 또는 DynamicTypeB) 값을 기준으로 합니다. 그런 다음 나머지 JSON 데이터를 생성된 구조체로 역마샬링한 다음 값 필드에 저장합니다.

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

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