>백엔드 개발 >Golang >Go에서 JSON 데이터를 인터페이스 유형으로 어떻게 역마샬링할 수 있나요?

Go에서 JSON 데이터를 인터페이스 유형으로 어떻게 역마샬링할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-20 09:22:11623검색

How Can I Unmarshal JSON Data into an Interface Type in Go?

인터페이스 유형으로 비정렬화

RPC에서 인터페이스 유형으로 마샬링하는 것은 객체가 로컬이고 리플렉터가 기본 유형을 식별할 수 있으므로 간단합니다. 그러나 인터페이스 유형으로 언마샬링하는 것은 어려운 일입니다.

리플렉터는 마샬링된 데이터를 수신할 새 인스턴스에 할당할 구체적인 유형을 결정할 수 없습니다. 이 제한은 모든 마샬링/마샬링 해제 작업에 적용됩니다.

일부 프레임워크에서 이 문제를 해결하기 위해 리플렉터를 지원하는 추가 정보가 제공됩니다. 예를 들어 Java Json(jackson)에서 JsonTypeInfo 주석은 클래스 유형을 지정합니다.

Go에서 사용자 정의 유형에 대한 Unmarshaler 인터페이스를 구현하면 이 문제를 해결할 수 있습니다. 다음 예를 고려하십시오.

import (
    "encoding/json"
    "errors"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

func main() {
    a := A{}
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}

위 내용은 Go에서 JSON 데이터를 인터페이스 유형으로 어떻게 역마샬링할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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