JSON 마샬링 및 역마샬링은 인터페이스 유형 작업 시 문제가 될 수 있습니다. 이 기사에서는 어려움을 자세히 살펴보고 해결책을 제공합니다.
인터페이스 유형에서 마샬링하는 것은 기본 유형이 로컬로 알려져 있어 리플렉터가 이를 식별할 수 있으므로 간단합니다.
그러나 인터페이스 유형에 대한 언마샬링은 문제가 있습니다. 구체적인 유형을 모르면 리플렉터는 마샬링된 데이터를 수신하기 위해 새 인스턴스를 인스턴스화할 수 없습니다.
이 제한 사항을 해결하기 위한 한 가지 접근 방식은 사용자 정의 유형에 대한 Unmarshaler 인터페이스를 구현하는 것입니다. . 아래 예를 참조하세요.
import ( "encoding/json" "fmt" "log" ) // RawString represents a raw JSON object. type RawString string // Implement the Marshaler and Unmarshaler interfaces. func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data); return nil } // Example data. const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` // Example struct. type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} if err := json.Unmarshal([]byte(data), &a); err != nil { log.Fatal("Unmarshal failed:", err) } fmt.Println("Done:", a) }
이 예에서 RawString은 Marshaler와 Unmarshaler를 모두 구현하여 사용자 지정 마샬링 및 역마샬링을 허용합니다. 그런 다음 기본 함수는 json.Unmarshal을 사용하여 JSON 데이터를 A의 인스턴스로 디코딩합니다.
위 내용은 Go의 인터페이스 유형을 사용하여 JSON 마샬링 및 역마샬링을 효과적으로 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!