将json null解组到NullString的指针中
我无法将将json null解组到NullString的指针中,json,go,unmarshalling,Json,Go,Unmarshalling,我无法将json.Unmarshal空值解组到结构中的*NullString字段中。下面是我的意思的一个简化示例: package main import ( "database/sql" "encoding/json" "log" ) // NullString type NullString struct { sql.NullString } func (n *NullString) UnmarshalJSON(b []byte) error { n.Valid
json.Unmarshal
空值解组到结构中的*NullString
字段中。下面是我的意思的一个简化示例:
package main
import (
"database/sql"
"encoding/json"
"log"
)
// NullString
type 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}`)
}
如您所见,解组对非空json值有效。但当我传入一个空json值时,空字符串解组器似乎甚至不会启动
有人知道我做错了什么吗?
背景
我之所以尝试这样做,是因为我计划从RESTAPI获取JSON值。并非API中的所有字段都是必填字段。因此,我使用结构字段的指针来帮助我构建SQL Update语句,因为:
- 带nil的字段表示未填充(不包括
)集合名称=?
- 非nil NullString.Valid==false表示实际空值(包括一个
)集合名=null
- 和非nil NullString.Valid==true表示存在一个实字符串值(包括
)集合名=?
Set
字段,该字段在触发UnmarshalJSON时更改为true(如果有任何值,则保证触发),然后将*NullString
更改为简单的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}`)
}