为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
喵喵时光机 2023-03-21 17:05:06
给定一个结构type Company struct {    ID   int             `json:"id"`                  Abn  sql.NullString  `json:"abn,string"`}当用这样的东西编组时company := &Company{}company.ID = 68company.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 中的值?
查看完整描述

4 回答

?
qq_笑_17

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


查看完整回答
反对 回复 2023-03-21
?
偶然的你

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))

}

是详细解释它的博客文章。



查看完整回答
反对 回复 2023-03-21
?
哆啦的时光机

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


查看完整回答
反对 回复 2023-03-21
?
慕斯709654

TA贡献1840条经验 获得超5个赞

该问题表明您希望将数据库结构公开为 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/


查看完整回答
反对 回复 2023-03-21
  • 4 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信