4 回答
TA贡献1818条经验 获得超7个赞
你不能,至少不能只使用sql.NullStringand encoding/json。
您可以做的是声明一个嵌入的自定义类型sql.NullString,并让该自定义类型实现该json.Marshaler接口。
type MyNullString struct {
sql.NullString
}
func (s MyNullString) MarshalJSON() ([]byte, error) {
if s.Valid {
return json.Marshal(s.String)
}
return []byte(`null`), nil
}
type Company struct {
ID int `json:"id"`
Abn MyNullString `json:"abn,string"`
}
https://play.golang.org/p/Ak_D6QgIzLb
TA贡献1841条经验 获得超3个赞
这是代码,
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
)
//Company details
type Company struct {
ID int `json:"id"`
Abn NullString `json:"abn"`
}
//NullString is a wrapper around sql.NullString
type NullString sql.NullString
//MarshalJSON method is called by json.Marshal,
//whenever it is of type NullString
func (x *NullString) MarshalJSON() ([]byte, error) {
if !x.Valid {
return []byte("null"), nil
}
return json.Marshal(x.String)
}
func main() {
company := &Company{}
company.ID = 68
//create new NullString value
nStr := sql.NullString{String: "hello", Valid: true}
//cast it
company.Abn = NullString(nStr)
result, err := json.Marshal(company)
if err != nil {
log.Println(err)
}
fmt.Println(string(result))
}
这是详细解释它的博客文章。
TA贡献1779条经验 获得超6个赞
另一种选择是使用*string而不是sql.NullString
type Company struct {
ID int `json:"id"`
Abn *string `json:"abn"`
}
现在您可能会问自己*string 和 sql.NullString 之间的区别是什么
没有有效的区别。我们认为人们可能希望使用 NullString,因为它很常见,并且可能比 *string 更清楚地表达了意图。但两者都行。——拉斯·考克斯 https://groups.google.com/g/golang-nuts/c/vOTFu2SMNeA/m/GB5v3JPSsicJ
TA贡献1840条经验 获得超5个赞
该问题表明您希望将数据库结构公开为 JSON(大概是 REST-ish)API。除非项目的生命周期很短或者逻辑层很简单,否则这种方法被认为是一种反模式。内部结构(数据库结构)与外部接口 (API) 耦合在一起,可能导致进行更改的成本很高。
我附上了一些读物,因为谷歌充满了如何做相反的教程:
https://thorben-janssen.com/dont-expose-entities-in-api/
- 4 回答
- 0 关注
- 138 浏览
添加回答
举报