我需要将json解析为golang中的结构体,最终值为float64
但似乎有些输入将其编码为字符串,有些输入将其编码为 float64
这涉及很多变量,所以我宁愿不为每个字段创建自定义函数
在 golang 中执行此操作的最佳方法是什么?
我知道 json 标签可以让值存储为字符串,但现在我收到原始浮点数,它开始出错
这是一个仅解析 FROM json 的操作,所以我不关心它意味着什么或使得编码为 json 变得不可能
示例代码:
type Example struct {
var1 float64 `json:"var1"`
}
func main() {
var ex Example
json.Unmarshal([]byte("{\"var1\":10.0}", &ex)
json.Unmarshal([]byte("{\"var1\":\"10.0\"}", &ex)
}
创建一个类型,根据需要解组 JSON。
type floatOrString float64
func (f *floatOrString) UnmarshalJSON(b []byte) error {
// Step 1: Get a string containing the float literal.
var s string
if len(b) > 0 && b[0] == '"' {
// It's a JSON string.
// Unmarshal to string to handle escaped chars and what not.
if err := json.Unmarshal(b, &s); err != nil {
return err
}
} else {
// Assume that it's a JSON number.
s = string(b)
}
// Step 2: Convert string to float.
pf, err := strconv.ParseFloat(s, 64)
if err != nil {
return err
}
*f = floatOrString(pf)
return nil
}
像这样使用它:
type Example struct {
Var1 floatOrString `json:"var1"`
}
var ex Example
json.Unmarshal([]byte("{\"var1\":123.0}"), &ex)
fmt.Println(ex)
json.Unmarshal([]byte("{\"var1\":\"456.0\"}"), &ex)
fmt.Println(ex)