緣由:
最近開發上遇到一個問題,通過grpcgateway 處理后的int64&uint64類型數據均轉換成了字符串類型,本身服務于前端,沒有任何問題。但是 項目部署現場后,發現需要兩套環境,那么就出現一個問題,經過grpcgateway 處理后的數據類型調整為了字符串類型,與原有類型不匹配,解析就出了問題?
思路:
嘗試過對數據結果進行包裝(笨方法,處理起來麻煩),對數據類型調整過,int64&uint64調整為字符串(笨方法,未嘗試 且麻煩,需要過多時間調整 且可能引發更多問題),最直接的方式就是處理字符串轉int64|uint64時 進行判斷,如果類型不一致,對值進行特殊處理即可。
?具體操作:
1. 自己寫方法,通過反射 比對 類型,處理值 進行轉換,因時間及對嵌套結構處理不完善問題放棄
2. 在原有方法上進行修改,拉取解析包到本地,一步步排查 解析值報錯,調整字符串值 為int類型值即可
具體調整:?
json 包:
?? ?調整位置:
?? ?json/decode.go/(*decodeState).literalStore
?? ?增添代碼:
?? ?if v.Type().Kind() == reflect.Int64 || v.Type().Kind() == reflect.Uint64 {
?? ??? ?s := string(item)
?? ??? ?if strings.HasPrefix(s, `"`) && strings.HasSuffix(s, `"`) {
?? ??? ??? ?item = item[1 : len(item)-1]
?? ??? ?}
?? ?}
?測試:
測試代碼:
?? ?type A struct {
?? ??? ?ID int64
?? ?}? ? type B struct {
? ? ? ? ID string
? ? }? ? func main() {
? ? ? ? b := B{ID: "23444"}
? ? ? ? bs, err := json.Marshal(b)
? ? ? ? fmt.Println(string(bs), err)? ? ? ? var a A
? ? ? ? err = json.Unmarshal(bs, &a)
? ? ? ? if err != nil {
? ? ? ? ? ? fmt.Printf("err: %v\r\n", err)
? ? ? ? }
? ? ? ? fmt.Println(a, err)
? ? }測試結果:
?? ?{"ID":"23444"} <nil>
?? ?{23444} <nil>