在浮点数的 JSON 输出中保留尾随零
在 Go 中,json.Marshal() 函数通常用于序列化数据结构转换为 JSON 格式。然而,它倾向于在转换过程中从浮点数中去除尾随零。如果使用应用程序希望数字有尾随零,这可能会出现问题。
要解决此问题,一种方法是创建一个实现 json.Marshaler 接口的自定义浮点类型。这允许您定义类型如何序列化为 JSON。下面是一个示例实现:
type KeepZero float64 func (f KeepZero) MarshalJSON() ([]byte, error) { if float64(f) == float64(int(f)) { return []byte(strconv.FormatFloat(float64(f), 'f', 1, 32)), nil } return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil }
在此代码中:
要使用 KeepZero 类型,您可以将数据结构中的原始 float64 字段替换为 KeepZero 字段。例如:
type Pt struct { Value KeepZero Unit string }
当您在 Pt 对象上调用 json.Marshal 时,将使用自定义 MarshalJSON 方法序列化 Value 字段,并在必要时保留尾随零。
data, err := json.Marshal(Pt{40.0, "some_string"}) fmt.Println(string(data), err)
这将产生以下 JSON 输出:
{"Value":40.0,"Unit":"some_string"}
此解决方案允许您保留尾随零根据消费应用程序的要求,将它们序列化为 JSON 时的浮点数。
以上是如何在 Go 浮点数的 JSON 输出中保留尾随零?的详细内容。更多信息请关注PHP中文网其他相关文章!