从 json float 或 string 解析为 float

问题描述 投票:0回答:1

我需要将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 go
1个回答
0
投票

创建一个类型,根据需要解组 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)

https://go.dev/play/p/U7KO2bbb7N_I

© www.soinside.com 2019 - 2024. All rights reserved.