自定义MarshalText()用于golang sql.NULL *类型

时间:2015-09-28 14:34:37

标签: go

我正在尝试在使用SQL.NullFloat64和https://github.com/kisielk/sqlstruct包的代码中将SQL结果编组为JSON。

参考:https://github.com/kisielk/sqlstruct/issues/11#issuecomment-143400458

这个问题是我得到了

{
    "Float64": 141,
    "Valid": true
}

导致JSON不仅仅是值。按照上面github问题的建议,我尝试制作一个自定义MarshalText(),但它永远不会被调用。

代码位于:https://gist.github.com/fils/3f557941d71f1a7165ca

生成的JSON位于:https://gist.github.com/fils/a01cadcbb5dc7c797c3e

CSV转储功能正在获取并输出该值,但不确定如何为JSON获取该效果。

使用sql.NullFloat64或自定义类型NullFloat64可以得到相同的结果。

1 个答案:

答案 0 :(得分:1)

您的NullFloat64不是encoding.TextMarshaler。见http://play.golang.org/p/AepGgQkOd7

prog.go:25: cannot use NullFloat64 literal (type NullFloat64) as type encoding.TextMarshaler in assignment:
    NullFloat64 does not implement encoding.TextMarshaler (wrong type for MarshalText method)
        have MarshalText() []byte
        want MarshalText() ([]byte, error)

将您的方法更改为

func (nf NullFloat64) MarshalText() ([]byte, error) {
    if nf.Valid {
        nfv := nf.Float64
        return []byte(strconv.FormatFloat(nfv, 'f', -1, 64)), nil
    } else {
        return []byte("null"), nil
    }
}