json Unmarshal時實際欄位型別與struct定義不一致會影響其他正常欄位解析

wulinlw發表於2017-06-26

json Unmarshal 時實際欄位型別與 struct 定義不一致會影響其他正常欄位解析? 見程式碼

package main

import (
    "encoding/json"
    "fmt"
)

type Role struct {
    Attr struct {
        Lv    int64 `json:"lv"`
        Money int64 `json:"money"`
    } `json:"attr"`
    Net struct {
        Ip  string `json:"ip"`
        Mac string `json:"mac"`
    } `json:"net"`
}

func main() {
    str := `{"attr":{"lv":15,"money":3},"net":{"ip":"8.8.8.8","mac":0}}`
    str2 := `{"net":{"ip":"8.8.8.8","mac":0},"attr":{"lv":15,"money":3}}`
    logData := &Role{}
    logData2 := &Role{}
    err := json.Unmarshal([]byte(str), logData)
    err2 := json.Unmarshal([]byte(str2), logData2)

    fmt.Printf("%#v\r\n", logData)
    fmt.Println(logData)
    fmt.Println(err)

    fmt.Printf("%#v\r\n", logData2)
    fmt.Println(logData2)
    fmt.Println(err2)
}

輸出結果是

&main.Role{Attr:struct { Lv int64 "json:\"lv\""; Money int64 "json:\"money\"" }{Lv:15, Money:3}, Net:struct { Ip string "json:\"ip\""; Mac string "json:\"mac\"" }{Ip:"8.8.8.8", Mac:""}}
&{{15 3} {8.8.8.8 }}
json: cannot unmarshal number into Go struct field .mac of type string

&main.Role{Attr:struct { Lv int64 "json:\"lv\""; Money int64 "json:\"money\"" }{Lv:0, Money:0}, Net:struct { Ip string "json:\"ip\""; Mac string "json:\"mac\"" }{Ip:"8.8.8.8", Mac:""}}
&{{0 0} {8.8.8.8 }}
json: cannot unmarshal number into Go struct field .mac of type string

可以看到,struct 的 mac 是 string 型別的,實際的 json 字串中 mac 因為一些不可控的原因等於 int 0 測試中發現解析發生錯誤後,後面的所有 key 都無法解析了,但是在實際專案中,json 產出資料不可控,是否有辦法跳過錯誤繼續處理呢

測試地址

更多原創文章乾貨分享,請關注公眾號
  • json Unmarshal時實際欄位型別與struct定義不一致會影響其他正常欄位解析
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章