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