确定解组时是否在json字符串中提供了值

时间:2018-09-30 20:59:43

标签: json go unmarshalling

当将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。否则,等级字段将保留指向值的指针。

但是我确定有更好的惯用方法来做到这一点?

0 个答案:

没有答案