インターフェイス型へのアンマーシャリング
Go の RPC および JSON パッケージの課題の 1 つは、インターフェイス型へのアンマーシャリングです。この問題を詳しく分析して、その解決策を探ってみましょう。
問題
インターフェイス型にアンマーシャルしようとすると、「json: オブジェクトを Go にアンマーシャルできません」のようなエラーが発生します。 main.Foo 型の値。」これは、リフレクターが、受信マーシャリングされたデータのインスタンスを作成する適切な具体的な型を決定できないために発生します。
解決策
この問題は、リフレクターで利用できる型情報が不足しているために発生します。アンマーシャリング中のリフレクター。たとえば、インターフェイス型変数からマーシャリングは可能ですが、アンマーシャリングは、リフレクターが対応する具象型を識別できないことが原因ではありません。
この問題を解決するために、Java の Json (jackson) などのフレームワークはアノテーションを使用して追加のアノテーションを提供します。タイプ情報。ただし、Go では、カスタム型の Unmarshaler インターフェイスを実装して、アンマーシャリング プロセスを自分で処理できます。
Unmarshaler の実装
ここでは、Unmarshaler インターフェイスを実装する例を示します。カスタムタイプ RawString:
type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data) return nil }
これで、次のことが可能になります。 JSON データを RawString インスタンスにアンマーシャリングします:
const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` 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) }
カスタム タイプに Unmarshaler 実装を提供することで、前述のエラーが発生することなく JSON データをアンマーシャリングできます。
以上がGo で JSON データをインターフェイス型にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。