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

我有一个包含 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)


繁星淼淼
浏览 229回答 2
2回答

呼唤远方

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 字段结构来说,它是过度工程化的。

沧海一幻觉

您可以使用指针type Animal struct {    Name *string    Age  int    Zone int}或包裹import "github.com/guregu/null"type Animal struct {    Name null.String    Age  int    Zone int}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go