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 關注
- 198 瀏覽
添加回答
舉報