登录
首页 >  Golang >  Go问答

如何以一种好的方式使用 SQL NULL 值和 JSON?

来源:Golang技术栈

时间:2023-03-05 11:05:52 419浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《如何以一种好的方式使用 SQL NULL 值和 JSON?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到golang等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

Go 类型喜欢Int64并且String不能存储空值,所以我发现我可以为此使用sql.NullInt64和sql.NullString。

但是当我在 Struct 中使用这些,并使用json包从 Struct 生成 JSON 时,格式与我使用常规Int64String类型时的格式不同。

JSON 有一个额外的级别,因为 sql.Null*** 也是一个结构。

是否有一个很好的解决方法,或者我不应该在我的 SQL 数据库中使用 NULL?

正确答案

sql.NullInt64这样的类型不会对 JSON 编组或解组进行任何特殊处理,因此适用默认规则。由于该类型是一个结构,它被编组为一个对象,其字段作为属性。

解决此问题的一种方法是创建自己的实现json.Marshaller/json.Unmarshaler接口的类型。通过嵌入sql.NullInt64类型,我们可以免费获得 SQL 方法。像这样的东西:

type JsonNullInt64 struct {
    sql.NullInt64
}

func (v JsonNullInt64) MarshalJSON() ([]byte, error) {
    if v.Valid {
        return json.Marshal(v.Int64)
    } else {
        return json.Marshal(nil)
    }
}

func (v *JsonNullInt64) UnmarshalJSON(data []byte) error {
    // Unmarshalling into a pointer will let us detect null
    var x *int64
    if err := json.Unmarshal(data, &x); err != nil {
        return err
    }
    if x != nil {
        v.Valid = true
        v.Int64 = *x
    } else {
        v.Valid = false
    }
    return nil
}

如果您使用此类型代替sql.NullInt64,它应该按照您的预期进行编码。

你可以在这里测试这个例子:http ://play.golang.org/p/zFESxLcd-c

今天关于《如何以一种好的方式使用 SQL NULL 值和 JSON?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表