golang 相容不同json結構體解析實踐
阿新 • • 發佈:2018-11-03
線上伺服器,同一個web介面有時需要相容不同版本的結構體。這種情況思路是使用interface{}接收任意型別資料,結合reflect包處理。
如下,http介面呼叫者會傳入不同的json結構資料(單體結構或切片結構):
type ReqStu struct { XXX struct { //XXX結構為單體 AAA string `json:"aaa"` BBB string `json:"bbb"` CCC string `json:"ccc"` } `json:"xxx"` }
type ReqStu struct { XXX []struct { //XXX為資料體切片 AAA string `json:"aaa"` BBB string `json:"bbb"` CCC string `json:"ccc"` } `json:"xxx"` }
相容不同XXX結構體的方法是使用interface{},接收任意型別資料。
type ReqStu struct { XXX interface{} `json:"xxx"` }
程式碼實現方面,使用反射判斷XXX型別kind,switch判斷分別解析處理資料。
switch reflect.ValueOf(Req.XXX).Kind() {//通過反射kind方法獲取XXX資料型別 case reflect.Slice, reflect.Array://切片或陣列型別的處理 var SliceTemp = []struct { AAA string `json:"aaa"` BBB string `json:"bbb"` CCC string `json:"ccc"` }{} if err := json.Unmarshal([]byte(Req),&SliceTemp );err != nil{ return } //range操作SliceTemp... default://預設單結構體 var SingleTemp = struct { AAA string `json:"aaa"` BBB string `json:"bbb"` CCC string `json:"ccc"` }{} if err := json.Unmarshal([]byte(Req),&SingleTemp );err != nil{ return } //操作SingleTemp... }