ホームページ > バックエンド開発 > Golang > Go で JSON データをインターフェイス型にアンマーシャリングするにはどうすればよいですか?

Go で JSON データをインターフェイス型にアンマーシャリングするにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-02 20:51:38
オリジナル
729 人が閲覧しました

How Can I Successfully Unmarshal JSON Data to Interface Types in Go?

インターフェイス型へのアンマーシャリング

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート