2016-06-30 4 views
0

のような単一要素または{"data": [{"id":1}, {"id":2}]}のような要素の配列となるJSON HTTPリクエストデータがあります。Goの "単一要素または配列" JSONプロパティを処理する最適な方法は何ですか?

クライアント側では実装を変更できないため、このデータ構造を維持して受け入れる必要があります。

現在、私は次のように構造体を実装:変数req

json.RawMessageとして
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

私は個人的にちょうど値の配列になるだろう。長さ1の配列を持つことができます。 – squiguy

+1

シングルトンを非整列化し、失敗した場合に配列として実行しようとするあなたの例は、Goでこれを処理する最も慣用的な方法です。 – evanmcdonnal

+1

[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

答えて

1

は、私はそれを行うだろう方法は次のとおりです。

type Request struct { 
    RawData json.RawMessage `json:"data" // export field for unmarshal of entire request 
    DataList []*Data `json:"-"`   // always use slice 
} 

// Is it an array? 
if bytes.HasPrefix(bytes.TrimSpace(req.RawData), []byte{'['})) { 
    if err := json.Unmarshal(req.RawData, &req.DataList); err != nil { 
     // handle error parsing array 
    } 
} else { 
    var v Data 
    if err := json.Unmarshal(req.RawData, &v); err != nil { 
     // handle error parsing single value 
    } 
    req.DataList = []*Data{&v) 
} 
+0

私は参照してください。単一の要素にマーシャリングするのではなく、実際の最初のバイト文字 '['を確認することができます。提案していただきありがとうございます!私はそれが好きです。 –

関連する問題