動的配列構造を使用した JSON のアンマーシャリング
サードパーティのソースから JSON データを取得する場合、データ構造は異なる場合があり、配列や配列が含まれる場合もあります。そうでない場合もあります。 Go の json.Unmarshal 関数を使用する場合、特定の構造体が JSON 構造に一致することが期待されるため、これにより問題が発生する可能性があります。
これを処理する一般的なアプローチは、次のようなスライスを含む 2 番目の構造体を作成することです。
type ResponseWithSlice struct { Gwrcmds struct { Gwrcmd []struct { // Nested struct now a slice Gcmd string Gdata struct { Gip struct { Version string } } } } }
これは機能しますが、構造体の複製が必要になるため、面倒になる可能性があります。
詳細汎用性の高い解決策には、json.RawMessage の使用が含まれます:
type Response struct { RawGwrcmd json.RawMessage `json:"gwrcmds"` }
このアプローチでは、gwrcmds フィールドが生の JSON メッセージとして保存され、それを覗いて、それに応じてアンマーシャリングできるようになります:
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawGwrcmd); err != nil { return err } if r.RawGwrcmd[0] == '[' { // Check if it's an array return json.Unmarshal(r.RawGwrcmd, &r.Gwrcmds.Gwrcmd) } return json.Unmarshal(r.RawGwrcmd, &r.Gwrcmds.Gwrcmd) // Otherwise, treat it as a single struct }
このメソッドを使用すると、追加の構造体を必要とせずに、配列構造と非配列構造の両方を処理できます。
以上がGo で動的配列構造を使用して JSON を効率的にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。