首页 > 后端开发 > Golang > 正文

如何在 Go 的浮点数 JSON 封送处理中保留尾随零?

Linda Hamilton
发布: 2024-11-27 20:19:10
原创
759 人浏览过

How Can I Preserve Trailing Zeroes in Go's JSON Marshaling of Floating-Point Numbers?

JSON 编组:保留浮点数中的尾随零

在 Go 中使用 json.Marshal() 将数据序列化为 JSON 时,尾随浮点数中的零经常被去掉。当接收端期望带有小数位的浮点值时,这可能会出现问题。

解决方案:自定义 Marshal 函数

防止 json.Marshal() 的有效方法删除尾随零的方法是为包含浮点值的类型定义自定义 MarshalJSON() 方法。这允许您手动控制序列化过程。

考虑以下示例:

type MyFloat float64

func (f MyFloat) MarshalJSON() ([]byte, error) {
    // Check if the float is an integer (no decimal part).
    if math.Trunc(float64(f)) == float64(f) {
        // Serialize as an integer without the trailing zero.
        return []byte(strconv.FormatInt(int64(f), 10)), nil
    }

    // Serialize as a floating-point number with the trailing zero.
    return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)), nil
}
登录后复制

在此示例中,MyFloat 类型定义了一个自定义 MarshalJSON() 方法,该方法检查 float 是否为一个整数(没有小数部分)并相应地序列化它。对于浮点数,它会将它们完整地序列化为尾随零。

用法:

一旦定义了自定义 MarshalJSON() 方法,就可以使用它序列化包含 MyFloat 类型的对象。例如:

type MyStruct struct {
    Value MyFloat
    Unit  string
}

// Serialize MyStruct using the custom MarshalJSON method.
data, err := json.Marshal(MyStruct{40.0, "some_string"})
登录后复制

这将导致以下 JSON 输出:

{
  "Value": 40.0,
  "Unit": "some_string"
}
登录后复制

注意:

  • 自定义 MarshalJSON () 方法必须在要序列化的类型上定义。
  • 如果 float 代表一个整数(没有小数部分),您可以考虑使用整数类型而不是浮点数以避免任何歧义。

以上是如何在 Go 的浮点数 JSON 封送处理中保留尾随零?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板