変数配列を返す JSON のアンマーシャリング
外部ソースから JSON を取得する場合、応答の構造が異なる可能性があるため、アンマーシャリングが困難になります固定の Go 構造体に変換します。これは、JSON に同じプロパティの配列または単一オブジェクトが含まれる場合に特に顕著です。
提供された例では、JSON 応答には、オブジェクトの配列またはオブジェクトのいずれかの「gwrcmd」というプロパティが含まれています。特異なオブジェクト。これに対処する 1 つのアプローチには、元の構造体と同じフィールドを持つ、ただし「gwrcmd」プロパティのスライスを持つ 2 番目の構造体を作成することが含まれます。ただし、json.RawMessage.
json.RawMessage を使用すると、より柔軟なソリューションを実現できます。これにより、不明な型を生の JSON 文字列にアンマーシャリングできます。この機能を使用すると、JSON を調べて、対応する Go 型にアンマーシャリングする適切な方法を決定できます。
次の簡略化された例を考えてみましょう。
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` } A A `json:"-"` As []A `json:"-"` } type A struct { B string } 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.RawMessage フィールド RawA は、「a」プロパティの JSON 値をキャプチャします。生の JSON の最初のバイトに基づいて、値が配列 ([]) であるかオブジェクト ("{") であるかを判断できます。この情報は、値を A 構造体 (オブジェクトの場合) または As スライス (配列の場合) にアンマーシャリングするために使用されます。
このアプローチは、変数構造を持つ JSON 応答を処理するための、より柔軟で堅牢な方法を提供します。これにより、構造体の重複が不要になり、JSON コンテンツに基づいた動的なアンマーシャリングが可能になります。
以上がGo で JSON をアンマーシャリングするときに返される変数配列を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。