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

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

Susan Sarandon
풀어 주다: 2024-12-08 01:48:16
원래의
544명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿