gpt4 book ai didi

mysql - sql.NullInt64 到 JSON

转载 作者:IT王子 更新时间:2023-10-29 02:35:27 25 4
gpt4 key购买 nike

我有一个数据库架构,其中年龄是可选。但是在 Go 中,通过我的 RestFUL 接口(interface),我将数据输出为 JSON,我得到一个非常难看的响应,如 {"ID":1,"Name":"John","age":{"Int64":0,“有效”:假}}
年龄。我希望省略一个空值。我错过了什么?

// CREATE TABLE users (
// id INT AUTO_INCREMENT PRIMARY KEY,
// name VARCHAR(50) NOT NULL,
// age INT
// );

// Age is optional

type user struct {
ID int `db:"id"`
Name string `db:"name"`
Age sql.NullInt64 `db:"age" json:"age,omitempty"`
}

func main() {
u := user{ID: 1, Name: "John"}
j, _ := json.Marshal(u)
fmt.Printf("%s", j)
}

// Expected: {"ID":1,"Name":"John"} since age is NULL/empty

https://play.golang.org/p/PS1-4Gw9h5u

最佳答案

sql.NullInt64 的存在是因为 SQL 的 null 不能表示为 Go 的 int。这是第三种状态,不能用任何 int 值表示。

一个解决方案是将这样的 SQL 值表示为 *int,但这需要为数据库中的值不为 null 的情况进行分配,分配不利于性能。

SQL 包的设计者提出了 NullInt64 解决方案,将 null 的第三种状态编码为附加的 Valid bool 值。这不是一个好的解决方案,但它是我们可以获得的最佳解决方案。

我不确定是否可以为 NullInt64 编写 JSON 编码器,它会像您预期的那样工作。

在编码为 JSON 时仍然存在“第三状态”问题。使用 ,omitempty 时,0 int 也将被省略,那么您如何区分 0 和“不存在”/null?

无论哪种方式,他们都没有为 NullInt64 编写自定义编码器,所以它只是按照结构本身进行编码。

您可以为 NullInt64 创建一个别名类型,编写一个 JSON 编码器来编码您想要的 JSON 方式(您需要一个别名,因为您不能向其他包中的类型添加方法)。您还需要在 NullInt64sql.NullInt64 之间进行转换。

关于mysql - sql.NullInt64 到 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com