You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何统一解析JSON中字符串/浮点型值为float64?

Go语言兼容JSON字符串/浮点型到float64的解析方案

你可以通过自定义兼容类型并实现json.Unmarshaler接口解决该问题,无需为每个字段单独编写解析逻辑,所有需要兼容的字段直接复用这个自定义类型即可。

具体实现

  1. 定义基于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
}
  1. 修改结构体,将目标字段替换为自定义类型:
type Example struct {
    Var1 FlexFloat64 `json:"var1"`
}
  1. 测试两种格式的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:46:01