您如何编组 sql.NullString 以便将输出展平以仅提供 go 中的值?

给定一个结构


type Company struct {

    ID   int             `json:"id"`              

    Abn  sql.NullString  `json:"abn,string"`

}

当用这样的东西编组时


company := &Company{}

company.ID = 68

company.Abn = "SomeABN"

result, err := json.Marshal(company)

结果是


{

    "id": "68",

    "abn": {

        "String": "SomeABN",

        "Valid": true

    }

}

想要的结果是


{

    "id": "68",

    "abn": "SomeABN"

}

我试过明确说明 Abn 是一个字符串。


Abn  sql.NullString  `json:"abn,string"`

这并没有改变结果。


您如何编组 sql.NullString 以便将输出展平以仅提供 go 中的值?


喵喵时光机
浏览 151回答 4
4回答

qq_笑_17

你不能,至少不能只使用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

偶然的你

这是代码,package mainimport (    "database/sql"    "encoding/json"    "fmt"    "log")//Company detailstype Company struct {    ID  int        `json:"id"`    Abn NullString `json:"abn"`}//NullString is a wrapper around sql.NullStringtype NullString sql.NullString//MarshalJSON method is called by json.Marshal,//whenever it is of type NullStringfunc (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))}这是详细解释它的博客文章。

哆啦的时光机

另一种选择是使用*string而不是sql.NullStringtype 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

慕斯709654

该问题表明您希望将数据库结构公开为 JSON(大概是 REST-ish)API。除非项目的生命周期很短或者逻辑层很简单,否则这种方法被认为是一种反模式。内部结构(数据库结构)与外部接口 (API) 耦合在一起,可能导致进行更改的成本很高。我附上了一些读物,因为谷歌充满了如何做相反的教程:https://lostechies.com/jimmybogard/2016/05/12/entities-arent-resources-resources-arent-representations/https://thorben-janssen.com/dont-expose-entities-in-api/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go