JSON を構造体にアンマーシャリングしようとすると、特定のフィールドが「json」タグ。このタグには、JSON データが構造体内で目的の文字列形式に正しく変換されるようにするための特別な処理が必要です。
この例では、構造体 A には、sql:"type:json" でタグ付けされたフィールド S があります。目標は、提供された JSON データの「S」の値を A 構造体内の文字列形式にアンマーシャリングすることです。
最初は、フィールド タグに文字列「json」が含まれているかどうかをチェックするためにリフレクションを使用することを検討したかもしれません。 " そして、JSON データをそのフィールドに文字列としてアンマーシャリングします。ただし、より効率的で洗練されたアプローチは、Go の標準ライブラリ機能を使用することです。
これを実現する 1 つの方法は、カスタム タイプ RawString を定義して実装することです。そのための MarshalJSON メソッドと UnmarshalJSON メソッド。これらのメソッドは、JSON データのエンコード方法とデコード方法をそれぞれ制御する方法を提供します。
この例では、RawString 型は文字列値をラップします。 MarshalJSON メソッドは文字列値をバイト スライスとして返しますが、UnmarshalJSON メソッドは受信したデータを既存の RawString に追加します。
次のステップは、A を定義することです。構造体。これには、I フィールド (64 ビット整数) と、RawString 型の S フィールドが含まれます。
これらのカスタム型とメソッドを使用すると、提供された JSON データを A 構造体にアンマーシャリングできます。次の Go コードはこれを示しています。
<code class="go">import ( "encoding/json" "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) }</code>
このアプローチを使用すると、JSON データを「json」タグが付けられたフィールドを持つ構造体に効果的にアンマーシャリングし、元の文字列形式を保持できます。
以上がJSON を「json」でタグ付けされたフィールドを持つ構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。