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 字段结构来说,它是过度工程化的。
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
}
- 2 回答
- 0 关注
- 228 浏览
添加回答
举报