配列またはオブジェクトを使用して JSON をアンマーシャリングする方法
JSON を扱う場合、返されるデータが配列またはオブジェクトである可能性があるシナリオを処理するオブジェクトは難しい場合があります。この記事ではこの問題に対処し、json.RawMessage タイプの使用と JSON 構造に基づく動的アンマーシャリングを含む解決策を紹介します。
動的 JSON 構造の公開
検討次の JSON 応答:
{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
応答では、gwrcmd はオブジェクトまたは配列のいずれかになります。これを考慮して、カスタム Go 構造体は次のように定義されます。
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string
アンマーシャリングの難題を解決する
この問題を解決する鍵は、json.RawMessage を利用することにあります。 、任意の JSON 値を受け入れます。生の JSON を保持するためのラッパーを Response 構造体内に作成します。
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` }
JSON 構造に基づく動的アンマーシャリング
Response 構造体の UnmarshalJSON メソッド内で、 RawAWrapper.RawA の最初のバイトを調べて、それが配列を表しているのかオブジェクトを表しているのかを判断します。結果に応じて、それに応じてデータをアンマーシャリングします。
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawAWrapper); err != nil { return err } if r.RawAWrapper.RawA[0] == '[' { return json.Unmarshal(r.RawAWrapper.RawA, &r.As) } return json.Unmarshal(r.RawAWrapper.RawA, &r.A) }
このアプローチにより、複数の構造体を必要とせずに、さまざまな構造を持つ JSON を柔軟に処理できます。
以上がデータが配列またはオブジェクトである可能性がある場合に JSON アンマーシャリングを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。