英文:
custom MarshalText() for golang sql.NULL* types
问题
我正在尝试在使用SQL.NullFloat64和https://github.com/kisielk/sqlstruct包的代码中将SQL结果转换为JSON。
问题是我在JSON中得到了以下结果,而不仅仅是值:
{
"Float64": 141,
"Valid": true
}
根据上述github问题中的建议,我尝试创建一个自定义的MarshalText()函数,但它从未被调用。
代码在这里:https://gist.github.com/fils/3f557941d71f1a7165ca
生成的JSON在这里:https://gist.github.com/fils/a01cadcbb5dc7c797c3e
CSV转储函数可以正确获取和输出值,但不确定如何在JSON中实现相同的效果。
无论是使用sql.NullFloat64还是自定义类型NullFloat64,结果都是相同的。
英文:
I am trying to marshal SQL results into JSON in code that is using SQL.NullFloat64 and the https://github.com/kisielk/sqlstruct package.
Ref: https://github.com/kisielk/sqlstruct/issues/11#issuecomment-143400458
This issue is I am getting the
{
"Float64": 141,
"Valid": true
}
result in the JSON not just the value. Following the advice in the github issue above I tried to make a custom MarshalText() but it never gets called.
The code is at: https://gist.github.com/fils/3f557941d71f1a7165ca
The JSON produced is at: https://gist.github.com/fils/a01cadcbb5dc7c797c3e
The CSV dump function is obtaining and outputting the value only ok, but not sure how to get that effect for the JSON one too.
Using either sql.NullFloat64 or the custom type NullFloat64 give the same results.
答案1
得分: 1
你的NullFloat64
不是一个encoding.TextMarshaler
。请参考http://play.golang.org/p/AepGgQkOd7:
prog.go:25: 无法将NullFloat64字面量(类型为NullFloat64)分配给类型encoding.TextMarshaler:
NullFloat64未实现encoding.TextMarshaler(MarshalText方法的类型错误)
具有MarshalText() []byte
期望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
}
}
英文:
Your NullFloat64
is not an encoding.TextMarshaler
. See 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)
Change your method to
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
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论