Golang标识并验证json值设置为null或未提供

b09cbbtk  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(128)

我有接受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值给定字段(不是非提供的),除了可选结构。你可以向我建议任何其他解决问题的办法。

gk7wooem

gk7wooem1#

尝试将Age设置为*int类型。
尝试将Age设置为Optional[int]类型。https://go.dev/play/p/f56pdESOEt7

wz3gfoph

wz3gfoph2#

从@Volker找到了一个解决方案,并发布了自己的答案:
上面的问题使用了Merge Patch JSON(rfc 7396)。有一个图书馆。
https://pkg.go.dev/github.com/evanphx/json-patch/v5#MergePatch
我拉取GET结果并合并GET结果和json补丁体。然后,您可以注意到哪些值无效。

相关问题