Go での混合型配列の JSON シリアル化のカスタマイズ
Go では、ネイティブ配列とスライスに混合型の要素を含めることはできません。ただし、シリアル化された JSON データに異種配列が必要なシナリオに対応するために、 json.Marshaler インターフェイスと json.Unmarshaler インターフェイスを利用して、オブジェクトのシリアル化および逆シリアル化の方法をカスタマイズできます。
混合型要素を含む構造体:
次のような構造体 Row を考えてみましょう。フィールド:
type Row struct { Ooid string Score float64 Text rune }
各構造体を 3 つの要素の配列としてシリアル化する必要がありますが、構造体を直接使用すると、出力が辞書のような構造体に変換されます。
MarshalJSON を使用したシリアル化のカスタマイズ:
シリアル化プロセスを制御するには、 Row 型の json.Marshaler インターフェイス。ここでは、混合値をエンコードするための仲介手段としてインターフェースのスライスを使用します。
func (r *Row) MarshalJSON() ([]byte, error) { arr := []interface{}{r.Ooid, r.Score, r.Text} return json.Marshal(arr) }
UnmarshalJSON による逆シリアル化のカスタマイズ:
逆に、逆シリアル化の場合は、 Row 型に json.Unmarshaler インターフェイスを実装できます。シリアル化と同様に、インターフェイスのスライスを利用して逆シリアル化された値を保存し、構造体フィールドに割り当てます。
func (r *Row) UnmarshalJSON(bs []byte) error { arr := []interface{}{} json.Unmarshal(bs, &arr) // TODO: handle errors if necessary r.Ooid = arr[0].(string) r.Score = arr[1].(float64) r.Text = arr[2].(string) return nil }
例:
次の JSON 構造を考えてみましょう:
[ ["ooid1", 2.0, "Söme text"], ["ooid2", 1.3, "Åther text"] ]
カスタマイズされたシリアル化関数と逆シリアル化関数を使用すると、次のことができます。この JSON データを Row 要素のスライスに変換し、異種配列形式を維持しながら元の JSON 構造に戻します。
要約すると、シリアル化と逆シリアル化をカスタマイズすることで、Go 開発者が複雑な JSON データ構造を処理できるようになります。これには型が混在した配列が含まれており、さまざまなデータ形式との柔軟性と互換性が提供されます。
以上がGo で JSON シリアル化および逆シリアル化で混合型配列を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。