为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查post请求中的json.body中是否有空值

如何检查post请求中的json.body中是否有空值

Go
繁星淼淼 2022-04-26 16:01:07
我有一个包含 4 个字段的结构:type Animal struct {    Name string    Age  int    Zone int}我正在发送一个发送 json 对象以解码为结构的 post 请求,json 应该如下所示:{"Age":10,"Name":"Lion", "Zone":1,}我希望所有字段都是字段,但是当我不填写所有字段并发送一些 json 之类的时候。{"Age":10,"Zone":1,}json.Decoder 自动构建该 Filed 并将其设置为""(该类型的零值)而不是 null。如何设置 null 值或检查它是否为 null 并生成错误?我希望结果是{Age:10, Zone:1, Name:null}或至少会产生错误!这是我用来将 json 转换为 struct 的代码animalModel := Animal{}err := json.NewDecoder(r.Body).Decode(&animalModel)
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

string不能为零。如果您想区分缺席字段、null值和空值"",您可以使用以下选项:


作为一种快速解决方案,您可以使用指针:

type Animal struct {

Name *string

}

缺点是您需要使用时间变量来设置此字段。


更灵活的解决方案是实现UnmarshalerAnimal 结构的接口并使用 temporalmap[string]string进行所需的检查并返回错误:

type Animal struct {

Name string

}


func (a *Animal) UnmarshalJSON(data []byte) error {

  m := map[string]interface{}{}

  err := json.Unmarshal(data, &m)

  if err != nil {

    return err

  }

  // check if field is exist

  name, exist := m["name"]

  if !exist {

    return fmt.Errorf("field 'name' should be present")

  }

  // check other fields...

  // ...


  // if all fields are ok, you can:

  // 1. set fields from map items

  a.Name = name

  ...


  // 2. call Unmarshal

  return json.Unmarshal(data, a)

}

这里的缺点是您需要“手动”检查每个字段。


下一步是使用重型机械:go-swagger或go-openapi。这些工具使您能够使用声明性模式 (OpenAPI) 对 JSON 数据执行检查,您可以轻松实现版本控制、发布 API 等等。当然,对于 3 字段结构来说,它是过度工程化的。


查看完整回答
反对 回复 2022-04-26
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您可以使用指针


type Animal struct {

    Name *string

    Age  int

    Zone int

}

或包裹


import "github.com/guregu/null"


type Animal struct {

    Name null.String

    Age  int

    Zone int

}


查看完整回答
反对 回复 2022-04-26
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信