在Golang中尝试反序列化为golang中的结构

问题描述 投票:0回答:1

实际上我正在尝试从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 Server Table structure

go struct google-app-engine-golang
1个回答
0
投票

你不必使用

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
}
© www.soinside.com 2019 - 2024. All rights reserved.