-
PIPIONE
int64您正在尝试从 JSON 字符串解析 an 。您可以使用实现 JSON Unmarshaler 接口的自定义类型来执行此操作。例如type User struct { Id int64 `json:"id"` Rating Int64String `json:"rating"`}type Int64String int64func (i Int64String) MarshalJSON() ([]byte, error) { return json.Marshal(strconv.FormatInt(int64(i), 10))}func (i *Int64String) UnmarshalJSON(data []byte) error { var jstring string err := json.Unmarshal(data, &jstring) if err != nil { return err } *(*int64)(i), err = strconv.ParseInt(jstring, 0, 64) return err}操场
-
POPMUISE
我建议您更改 api,如果那不可能,那么您可以使用接口类型进行评级并在解析期间手动检查类型(int 将返回为 float64):package mainimport ( "fmt" "encoding/json")type User struct { Id int `json:"id"` Rating interface{} `json:"rating"`}func main() { usersJson := `[{"id": 1, "rating": 0}, {"id": 2,"rating": "2"}]` var users []User err := json.Unmarshal([]byte(usersJson), &users) if err != nil { fmt.Println("err: ",err) return } for _, u := range users { switch u.Rating.(type) { case float64: fmt.Println("its an float64", u.Rating.(float64)) case string: fmt.Println("its an string", u.Rating.(string)) } }}
-
慕丝7291255
像这样解决:type Int64 struct { Value int64}func (this *Int64) UnmarshalJSON(bytesValue []byte) error { stringValue := string(bytesValue) if len(stringValue) > 2 { if stringValue[0] == '"' && stringValue[len(stringValue)-1] == '"' { stringValue = stringValue[1 : len(stringValue)-1] } } var err error this.Value, err = strconv.ParseInt(stringValue, 10, 64) return err}func (this *Int64) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf("%v", this.Value)), nil}