我有接受PATCH方法和更新给定字段的API。以下主体的PATCH请求更改用户的年龄。
{
"age": 10
}
我在处理null
值时遇到了问题。我的User
结构如下:
type User struct {
Name string
Age int
Schedule *schedule
}
type Schedule struct {
time int
weekdays []int
}
要删除用户的计划字段,请求正文应类似于:
{
"schedule": null
}
然后,我必须确定是否给出了空值或没有提供任何东西,这在上面的定义中是不可能的。我写了一个新的结构来帮助识别它(https://www.calhoun.io/how-to-determine-if-a-json-key-has-been-set-to-null-or-not-provided/):
type User struct {
Name
Age int
Schedule Optional[Schedule]
}
type Optional[T any] struct {
Value *T
Defined bool
}
func (t *Optional[T]) UnmarshalJSON(data []byte) error {
t.Defined = true
return json.Unmarshal(data, &t.Value)
}
func (t *Optional[T]) IsNullDefined() bool {
return t.Defined && t.Value == nil
}
func (t *Optional[T]) HasValue() bool {
return t.Defined && t.Value != nil
}
而且,现在我有问题,行动是不同的
{
"age": null
}
它将被忽略,
{
"schedule": null
}
这将删除时间表。
我如何处理和防止null
值为其他类型,这应该是类型错误?
编辑:
在一句话中,我想拒绝所有null
值给定字段(不是非提供的),除了可选结构。你可以向我建议任何其他解决问题的办法。
2条答案
按热度按时间gk7wooem1#
尝试将
Age
设置为*int
类型。尝试将
Age
设置为Optional[int]
类型。https://go.dev/play/p/f56pdESOEt7wz3gfoph2#
从@Volker找到了一个解决方案,并发布了自己的答案:
上面的问题使用了Merge Patch JSON(rfc 7396)。有一个图书馆。
https://pkg.go.dev/github.com/evanphx/json-patch/v5#MergePatch
我拉取GET结果并合并GET结果和json补丁体。然后,您可以注意到哪些值无效。