首页 > 后端开发 > Golang > 如何区分 Go 中的 Null 和缺失 JSON 字段?

如何区分 Go 中的 Null 和缺失 JSON 字段?

Barbara Streisand
发布: 2024-12-05 08:57:09
原创
799 人浏览过

How to Differentiate Between Null and Absent JSON Fields in Go?

区分设置为空的 JSON 字段和不存在的字段

将 JSON 解组到 Go 结构体时,辨别字段是空还是不存在可能是一个挑战。这两种情况都会导致结构体中出现 nil 值,从而很难确定该字段的原始存在。

为了解决此问题,让我们探索两个解决方案:

1.使用泛型 (Go 1.18 )

Go 1.18 引入了泛型,允许我们创建一个通用结构来跟踪 JSON 值的存在:

type Optional[T any] struct {
    Defined bool
    Value   *T
}
登录后复制

这个可选结构使用 Defined字段来指示该值是否存在于 JSON 负载中。当该字段存在时,值字段保存未编组的值。通过将此结构合并到您自己的结构中,您可以区分 null 和缺失字段:

type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[bool]   `json:"field2"`
    Field3 Optional[int32]  `json:"field3"`
}
登录后复制

2.自定义类型(预泛型)

在泛型之前,我们可以创建一个自定义类型来处理可选值:

type OptionalString struct {
    Defined bool
    Value   *string
}
登录后复制

此类型包括一个 Defined 字段来指示存在和一个用于保存未编组字符串的值字段。通过为您需要处理的每种类型定义自定义类型(例如,整数的OptionalInt),您可以保留有关字段存在的信息。

示例:

考虑以下 JSON 有效负载:

{
  "somefield1":"somevalue1",
  "somefield2":null
}
登录后复制
{
  "somefield1":"somevalue1",
}
登录后复制

使用我们的解决方案,我们可以区分在这些情况之间:

p1 := Payload{}
_ = json.Unmarshal([]byte(`{
            "somefield1": "somevalue1",
            "somefield2": null
        }`), &p1)

fmt.Printf("Should be defined == true and value == nil: \n%+v\n\n", p1)
登录后复制

输出:

Should be defined == true and value == nil: 
{SomeField1:somevalue1 SomeField2:{Defined:true Value:<nil>}}
登录后复制
p2 := Payload{}
_ = json.Unmarshal([]byte(`{
            "somefield1": "somevalue1",
        }`), &p2)

fmt.Printf("Should be defined == false: \n%+v\n\n", p2)
登录后复制

输出:

Should be defined == false: 
{SomeField1:somevalue1 SomeField2:{Defined:false Value:<nil>}}
登录后复制

这些示例演示了我们的解决方案如何区分空和不存在JSON字段,在反序列化过程中提供有价值的信息。

以上是如何区分 Go 中的 Null 和缺失 JSON 字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板