第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將 json null 解組為 NullString 的指針

將 json null 解組為 NullString 的指針

Go
阿晨1998 2023-04-17 15:20:13
我無(wú)法將json.Unmarshalnull 值放入*NullString結(jié)構(gòu)中的字段中。這是我的意思的一個(gè)簡(jiǎn)化示例:package mainimport (  "database/sql"  "encoding/json"  "log")// NullStringtype NullString struct {  sql.NullString}func (n *NullString) UnmarshalJSON(b []byte) error {  n.Valid = string(b) != "null"  e := json.Unmarshal(b, &n.String)  return e}type Person struct {  Name *NullString `json:"name"`}func BuildUpdateSQL(jsonString string) string {  p := Person{}  e := json.Unmarshal([]byte(jsonString),&p)  if e != nil {    log.Println(e)  }  if p.Name != nil {    log.Println(p,p.Name)  } else {    log.Println(p)  }  return ""}func main() {  // Correctly leaves p.Name unset  BuildUpdateSQL(`{"field_not_exist":"samantha"}`)  // Correctly sets p.Name  BuildUpdateSQL(`{"name":"samantha"}`)  // Incorrectly leaves p.Name as nil when I really want p.Name to have a NullString with .Valid == false  BuildUpdateSQL(`{"name":null}`)}如您所見(jiàn),解組適用于非空 json 值。但是當(dāng)我傳入一個(gè)空的 json 值時(shí),NullString 解組器似乎甚至沒(méi)有觸發(fā)。有人知道我做錯(cuò)了什么嗎?背景我嘗試這樣做的原因是因?yàn)槲矣?jì)劃從 REST API 獲取 JSON 值。并非 API 中的所有字段都是必填字段。因此,我使用結(jié)構(gòu)字段的指針來(lái)幫助我構(gòu)建 SQL Update 語(yǔ)句,因?yàn)椋簬в?nil 的字段表示未填充(不包括SET name = ?)non-nil NullString.Valid == false 表示實(shí)際的空值(包括一個(gè)SET name = NULL)和非零 NullString.Valid == true 表示存在真實(shí)的字符串值(包括 a SET name = ?)
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊

是的,這是因?yàn)橐韵陆饨M規(guī)則:

要將 JSON 解組為指針,Unmarshal 首先處理 JSON 為 JSON 文字 null 的情況。在這種情況下,Unmarshal 將指針設(shè)置為 nil。否則,Unmarshal 將 JSON 解組為指針指向的值。

我建議做的是添加一個(gè)Set字段,該字段在 UnmarshalJSON 被觸發(fā)時(shí)更改為 true(如果有任何值,則保證被觸發(fā)),然后將 更改*NullString為簡(jiǎn)單的NullString,如下所示:

package main


import (

? ? "database/sql"

? ? "encoding/json"

? ? "log"

)


// NullString

type NullString struct {

? ? Set bool

? ? sql.NullString

}


func (n *NullString) UnmarshalJSON(b []byte) error {

? ? n.Set = true

? ? n.Valid = string(b) != "null"

? ? e := json.Unmarshal(b, &n.String)

? ? return e

}


type Person struct {

? ? Name NullString `json:"name"`

}


func BuildUpdateSQL(jsonString string) string {

? ? p := Person{}

? ? e := json.Unmarshal([]byte(jsonString), &p)

? ? if e != nil {

? ? ? ? log.Println(e)

? ? }


? ? log.Printf("%#v", p)

? ? return ""

}


func main() {

? ? BuildUpdateSQL(`{"field_not_exist":"samantha"}`)

? ? BuildUpdateSQL(`{"name":"samantha"}`)

? ? BuildUpdateSQL(`{"name":null}`)

}


查看完整回答
反對(duì) 回復(fù) 2023-04-17
  • 1 回答
  • 0 關(guān)注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)