のような単一要素または{"data": [{"id":1}, {"id":2}]}
のような要素の配列となるJSON HTTPリクエストデータがあります。Goの "単一要素または配列" JSONプロパティを処理する最適な方法は何ですか?
クライアント側では実装を変更できないため、このデータ構造を維持して受け入れる必要があります。
現在、私は次のように構造体を実装:変数req
に
type Request struct {
rawData json.RawMessage `json:"data"`
Data *Data `json:"-"`
DataList []*Data `json:"-"`
}
そして、最初の解析「データ」プロパティ、それは配列として解析してみてください失敗した後ならば、最初に単一の要素として解析してみてください。この場合
if err := json.Unmarshal(req.rawData, &req.Data); err != nil {
if err := json.Unmarshal(req.RawData, &req.DataList); err != nil {
return errors.New("could not parse data")
} else if len(req.DataList) < 1 {
return errors.New("empty list")
}
}
私たちは、このデータを使用したいときrawData
は、単一の要素またはlen(req.Datalist) >= 1
によって配列の場合、後に、私たちは確認することができます。 (または、構文解析時に構造体にisDataMultiple
のようなフラグを設定することもできます)。
私がやっていること以外にGoで同じ結果を達成する慣用方法はありますか?ここで
私は個人的にちょうど値の配列になるだろう。長さ1の配列を持つことができます。 – squiguy
シングルトンを非整列化し、失敗した場合に配列として実行しようとするあなたの例は、Goでこれを処理する最も慣用的な方法です。 – evanmcdonnal
[one](http://stackoverflow.com/questions/32346117/unmarshalling-a-json-that-may-or-may-not-return-an-array)、[two](http: /stackoverflow.com/questions/37152092/what-is-a-good-way-to-handle-single-or-array-struct-in-golang-json-unmarshal)、[three](http:// stackoverflow。 com/questions/33622016/json-sometimes-array-sometimes-object)、[4](http://stackoverflow.com/questions/33569210/go-json-unmarshal-options)を参照してください。 – icza