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 关注
- 96 浏览
添加回答
举报