golang 兼容不同json結構體解析實踐


線上服務器,同一個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 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...
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM