实际上我正在尝试从sql server(特定表)获取数据,我的期望是将从sql server获取的数据反序列化为GoLang中的struct。
声明了下面的结构体
type TrnVmSeries struct {
VmCode sql.NullString
IsHidden sql.NullBool
Cores sql.NullInt32
Ram sql.NullFloat64
}
func ReadSqlData() {
var con *sql.DB = SqlConnection()
defer CloseConnection(con)
var resObj []model.TrnVmSeries
rows, err := con.Query("select * from testGo")
if err != nil {
fmt.Println("Error executing query:", err.Error())
}
for rows.Next() {
var vm model.TrnVmSeries
if err := rows.Scan(&vm.VmCode, &vm.IsHidden, &vm.Cores, &vm.Ram); err != nil {
fmt.Println(err)
}
resObj = append(resObj, vm)
}
jsonData, err := json.Marshal(resObj)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Json serialized Data %v", string(jsonData))
fmt.Println("Object Output", resObj[0])
}
我已经尝试过低于输出
`[ { “虚拟机代码”:{ “细绳”:””, “有效”:假 }, “隐藏”:{ “布尔”:假, “有效”:正确 }, “核心”:{ “Int32”:0, “有效”:正确 }, “内存”: { “浮动64”:10, “有效”:正确 }
} ]`
但是我的期望低于
[ { "VmCode": null, "IsHidden": false "Cores": 0 "Ram": 10 } ]
我不知道如何实现这一点,请帮助我。以获得预期的对象。还附上SQL表结构
你不必使用
sql.Null*
- 你可以只使用指针:
type TrnVmSeries struct {
VmCode *string
IsHidden *bool
Cores *int32
Ram *float64
}
或者您可以拥有自己的自定义 Null 类型,以您想要的方式实现 json 封送,例如
type NullString sql.NullString
type NullBool sql.NullBool
type NullInt32 sql.NullInt32
type NullFloat64 sql.NullFloat64
func (s NullString) MarshalJSON() ([]byte, error) {
if s.Valid {
return json.Marshal(s.String)
}
return []byte(`null`), nil
}
// same thing for the other Null types...
type TrnVmSeries struct {
VmCode NullString
IsHidden NullBool
Cores NullInt32
Ram NullFloat64
}