3 回答

TA貢獻1829條經驗 獲得超9個贊
int64您正在嘗試從 JSON 字符串解析 an 。您可以使用實現 JSON Unmarshaler 接口的自定義類型來執行此操作。
例如
type User struct {
Id int64 `json:"id"`
Rating Int64String `json:"rating"`
}
type Int64String int64
func (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
}

TA貢獻1765條經驗 獲得超5個贊
我建議您更改 api,如果那不可能,那么您可以使用接口類型進行評級并在解析期間手動檢查類型(int 將返回為 float64):
package main
import (
"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))
}
}
}

TA貢獻1859條經驗 獲得超6個贊
像這樣解決:
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
}
- 3 回答
- 0 關注
- 141 瀏覽
添加回答
舉報