1 回答

TA貢獻1827條經驗 獲得超8個贊
嘗試這個
package main
import (
"encoding/json"
"fmt"
"strconv"
"strings"
)
type StringToFloat float64
type Order struct {
Id string `json:"id"`
Price StringToFloat `json:"price"`
}
func (foe *StringToFloat) UnmarshalJSON(data []byte) error {
if string(data) == "\"\"" {
if foe != nil {
*foe = 0
}
return nil
}
num := strings.ReplaceAll(string(data), "\"", "")
n, err := strconv.ParseFloat(num, 64)
if err != nil {
return err
}
*foe = StringToFloat(n)
return nil
}
func main() {
jsonString := `[
{"id": "A", "price": "123"},
{"id": "B", "price": "123.5"},
{"id": "C", "price": ""}
]`
var orders []Order
if err := json.NewDecoder(strings.NewReader(jsonString)).Decode(&orders); err != nil {
fmt.Println(err)
}
fmt.Println(orders)
}
去游樂場:https ://go.dev/play/p/cHjNQ447eX9
注意事項:
UmarshalJSON func 的函數簽名需要與 Decode 獲取的給定函數簽名完全相同。在您更新的代碼
error
中缺少返回類型string(data)
給出"123"
所以需要在之前刪除引號ParseFloat
return nil
在 string =""
check 之后是必需的,所以它不會走得更遠
- 1 回答
- 0 關注
- 113 瀏覽
添加回答
舉報