2016-06-30 43 views
0

現在我們有一個JSON HTTP請求數據,它將是一個單一元素,如 {"data": {"id":1}}或者像{"data": [{"id":1}, {"id":2}]}這樣的元素數組。在Go中處理「單個元素或數組」的JSON屬性的最佳方式是什麼?

由於客戶端無法更改實現,我們必須保留並接受這個數據結構。

目前我實現結構喜歡:

type Request struct { 
    rawData json.RawMessage `json:"data"` 

    Data *Data `json:"-"` 
    DataList []*Data `json:"-"` 
} 

與第一解析「數據」財產json.RawMessage成可變req,首先嚐試解析爲一個單一的元素,那麼如果失敗嘗試解析爲一個數組。

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)。

除了我在做什麼之外,還有什麼地方方法可以達到同樣的效果嗎?

+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),[four](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

我明白了。我們可以檢查實際的第一個字節字符'',而不是嘗試編入單個元素。感謝您的建議!我喜歡。 –

相關問題