カスタム タグ処理による JSON のアンマーシャリング
JSON を構造体にアンマーシャリングしようとする場合、カスタム タグを持つフィールドを別の方法で処理する必要がある場合があります。 。この記事では、構造体のフィールドに文字列としてアンマーシャリングする必要があることを示すタグが付いている問題について説明します。
問題:
JSON 文字列と対応する構造体:
<code class="json">{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }</code>
<code class="go">type A struct { I int64 S string `sql:"type:json"` }</code>
目的は、「S」フィールドを構造体ではなく文字列としてアンマーシャルすることです。
解決策:
マーシャラー/アンマーシャラー インターフェイスの使用:
Go は、カスタム タイプのマーシャラー インターフェイスとアンマーシャラー インターフェイスを実装することで、デフォルトの JSON マーシャリングおよびアンマーシャリングの動作をオーバーライドする方法を提供します。この場合、RawString という新しい型を作成し、次の関数を実装します。
<code class="go">type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("RawString: UnmarshalJSON on nil pointer") } *m += RawString(data) return nil }</code>
構造体への適用:
RawString 型を使用するように A 構造体を変更します。 「S」フィールドの場合:
<code class="go">type A struct { I int64 S RawString `sql:"type:json"` }</code>
この実装では、JSON が A 構造体にアンマーシャリングされると、「S」フィールドは文字列としてアンマーシャリングされ、元の JSON 表現が維持されます。
使用例:
<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` func main() { a := A{} err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed:", err) } fmt.Println("Done", a) }</code>
出力:
<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
以上が文字列表現のカスタムタグ処理を使用して JSON をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。