ホームページ >バックエンド開発 >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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。