>백엔드 개발 >Golang >일반 자리 표시자 필드 없이 Go에서 동적 JSON을 비정렬화하는 방법은 무엇입니까?

일반 자리 표시자 필드 없이 Go에서 동적 JSON을 비정렬화하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-12 11:39:12933검색

How to Unmarshal Dynamic JSON in Go without Generic Placeholder 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 구조체로 언마샬링되어야 합니다.

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

핵심 질문은 다음과 같습니다. Something 유형을 생성하고 비마샬링 논리를 구현하는 방법은 무엇입니까?

해결책: 사용자 정의 UnmarshalJSON 메서드와 인터페이스 사용

해결책에는 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 인스턴스를 생성합니다.

UnmarshalJSON 구현 BigStruct

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

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