亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

您如何編組 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 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號