>백엔드 개발 >Golang >일반 필드 없이 유형 키를 기반으로 Go에서 동적 JSON을 비정렬화하는 방법은 무엇입니까?

일반 필드 없이 유형 키를 기반으로 Go에서 동적 JSON을 비정렬화하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-19 10:49:12324검색

How to Unmarshal Dynamic JSON in Go Based on a Type Key Without Generic Fields?

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

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