這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在公司主要做介面的開發,會經常遇到介面對接的情況。有的時候,同一個請求返回的JSON資料格式並不一樣。如果是正常,則可能只返回一個status
欄位,說明正常;如果中間出錯,除了在status
欄位裡面說明錯誤類型,還會通過error_message
附帶錯誤詳細資料。比如要給使用者加積分,如果加分失敗,還會附帶使用者id等資訊。那麼,請求一個介面可能的傳回值就是不確定的。
我最初就是定義兩個結構體,我處理的資料都共有一個欄位status
,如果能夠解析並且status
表示操作成功,那麼用封裝成功內容的結構體解析;否則,用封裝失敗的結構體解析。這就是傳說中的DIRTY HACK。。。
後來,偶然發現封裝正確的結構體也會解析錯誤的字串,當然,只會解析共有欄位。那麼,這個問題就好解決多了。把兩個結構體放到一起即可,如果沒有該欄位,就不會被解析放入值。也就是說,未被解析的變數放的是預設值。
package mainimport ("encoding/json""fmt")type Result struct {Status int `json:"status"`Message string `json:"message"`ErrorCode int `json:"error_code"`ErrorMessage string `json:"error_message"`}func main() {json_str0 := `{"status":0,"message":"success"}`json_str1 := `{"status":1,"error_code":5,"error_message":"error"}`res0 := Result{}res1 := Result{}err0 := json.Unmarshal([]byte(json_str0), &res0)err1 := json.Unmarshal([]byte(json_str1), &res1)fmt.Println(res0, err0)fmt.Println(res1, err1)}
這麼簡單的東西,Go語言的基本文法,但是看書的時候沒有注意過,關鍵是做的時候沒有認真分析,就直接DIRTY HACK了,我都不能忍自己了。。。
最後,還有一點,Go支援未知JSON資料結構的解析。建立一個interface,把它的地址傳進去解析就行了,會解析出map[string]interface
類型的資料。
參考文獻
原文連結:Go語言介面開發——不確定JSON資料結構的解析,轉載請註明來源!