当将json解组到结构中时,我想查看该结构(或任何其他元数据载体)以了解json输入中是否提供了json值,或者是否从json中省略了json值输入。以下面的代码为例:
package main
import (
"encoding/json"
"log"
)
type Person struct {
Name string `json:"name"`
Grades []Grade `json:"grades"`
}
type Grade struct {
Year int `json:"year"`
Grade int `json:"grade"`
}
func main() {
jsonString := `{"name":"john","grades":[{"year":1998,"grade":0},{"year":1999}]}`
person := Person{}
_ = json.Unmarshal([]byte(jsonString),&person)
log.Println(person)
}
日志显示{john [{1998 0} {1999 0}]}
。知道1998 0
的零是在JSON字符串中显式声明的,而1999 0
的零是初始化struct Grade
时的默认零,这是惯用的方式吗?
我想知道这种差异的原因是因为我想使用此结构来创建一条SQL语句,该语句在且仅当json字符串显式提供了零时才更新表字段t_grade.grade = ?
。另请注意,数据库中的t_grade.grade
是不可为空的。
我当前正在使用一个我的成绩结构如下所示的hack:
type Grade struct {
Year *int `json:"year"`
Grade *int `json:"grade"`
}
因此,如果JSON字符串不提供值,那么grade字段将为null。否则,等级字段将保留指向值的指针。
但是我确定有更好的惯用方法来做到这一点?