Xiangism

从一个无知角落里开始,蹒跚学步,一个未知到另一个未知,在跌跌撞撞中越走越快,越走越远,最后宇宙也为之开源。对于探索者来说,最后他们的思想总是变得和自己的足迹一样伟大。
  博客园  :: 首页  :: 联系 :: 管理

golang中json.Marshal自定义浮点数格式化样式

Posted on 2022-10-15 21:10  Xiangism  阅读(412)  评论(0编辑  收藏  举报

golang中如果有以下的类型

type QpsObj struct {
    Key string  `json:"key"`
    Qps float64 `json:"qps"`
}

json.Marshal后会输出如下的字符串 {"key":"test","qps":115.22333333333333}

如果Qps字段只想保存小数点后两位该如何做呢?

一种是实现如下方法

func (j *QpsObj) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf(`{"key":"%v", "qps":"%0.2f"}`, j.Key, j.Qps)), nil
}

输出 {"key":"test","qps":"115.22"} 

但如果QpsObj中的字段更多,这种方式就不现实。

思考一阵后想到可以重定义float64类型。代码如下

type MyFloat float64

func (f MyFloat) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf("%0.2f", f)), nil
}

type QpsObj struct {
    Key string  `json:"key"`
    Qps MyFloat `json:"qps"`
}

输出 {"key":"test","qps":"115.22"}

euraka