JSON データの操作では、多くの場合、さらに処理するために構造体に変換する必要があります。ただし、アンマーシャリング プロセスに影響を与えるカスタム タグを持つフィールドが構造体に含まれている場合、問題が発生します。この記事では、Go のリフレクション機能を使用してこのようなシナリオを処理する方法を説明します。
この特定の状況では、目標は、フィールドの 1 つがタグを持つ構造体に JSON データをアンマーシャリングすることです。これは、JSON 文字列として扱う必要があることを示します。次の例を考えてみましょう。
<code class="go">const data = `{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }` type A struct { I int64 S string `sql:"type:json"` }</code>
この場合、目的は、JSON の「S」フィールドを文字列として構造体 A にアンマーシャリングすることです。
Go は、カスタムのアンマーシャリング動作を可能にする組み込みの UnmarshalJSON メソッドを提供します。新しい型を作成し、MarshalJSON メソッドと UnmarshalJSON メソッドを実装することで、目的の結果を達成できます。
<code class="go">import ( "encoding/json" "errors" "log" "fmt" ) // 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>
このソリューションでは、RawString 型は MarshalJSON メソッドと UnmarshalJSON メソッドを実装して、JSON データのエンコード方法を制御し、デコードされ、基本的にアンマーシャリング中に "S" フィールドを文字列として扱うことができるようになります。
Go のリフレクション機能とカスタム アンマーシャリング メソッドを活用することで、複雑な JSON アンマーシャリング シナリオを処理することができます。フィールドに特別な処理が必要な特定のタグがある場合でも。
以上がGo でカスタム フィールド タグを使用して JSON データをアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。