Go语言如何统一解析JSON中字符串/浮点型值为float64?
Go语言兼容JSON字符串/浮点型到float64的解析方案
你可以通过自定义兼容类型并实现json.Unmarshaler接口解决该问题,无需为每个字段单独编写解析逻辑,所有需要兼容的字段直接复用这个自定义类型即可。
具体实现
- 定义基于
float64的自定义类型,实现UnmarshalJSON方法自动处理两种格式:
import ( "encoding/json" "strconv" ) type FlexFloat64 float64 func (f *FlexFloat64) UnmarshalJSON(data []byte) error { // 先尝试直接解析为浮点型 var num float64 if err := json.Unmarshal(data, &num); err == nil { *f = FlexFloat64(num) return nil } // 解析失败则尝试按字符串解析后转浮点型 var str string if err := json.Unmarshal(data, &str); err != nil { return err } num, err := strconv.ParseFloat(str, 64) if err != nil { return err } *f = FlexFloat64(num) return nil }
- 修改结构体,将目标字段替换为自定义类型:
type Example struct { Var1 FlexFloat64 `json:"var1"` }
- 测试两种格式的JSON解析:
import "fmt" func main() { var ex Example // 解析浮点型JSON if err := json.Unmarshal([]byte(`{"var1":10.0}`), &ex); err != nil { fmt.Printf("浮点型解析失败: %v\n", err) } else { fmt.Printf("浮点型解析结果: %.1f\n", float64(ex.Var1)) } // 解析字符串型JSON if err := json.Unmarshal([]byte(`{"var1":"10.0"}`), &ex); err != nil { fmt.Printf("字符串型解析失败: %v\n", err) } else { fmt.Printf("字符串型解析结果: %.1f\n", float64(ex.Var1)) } }
关键说明
- 自定义类型
FlexFloat64可通过float64()强制转换为标准float64,不影响后续数值计算。 - 该类型可复用在所有需要兼容的字段上,避免重复编写逻辑。
- 若JSON中的字符串无法转换为有效浮点数,解析会返回错误,符合正常错误处理逻辑。
内容的提问来源于stack exchange,提问作者dtracers
相关产品推荐
相关产品推荐

