【发布时间】:2018-09-10 02:53:35
【问题描述】:
是否有一种简单的方法可以检查 myStruct 的每个字段是否使用 json.Unmarshal(jsonData, &myStruct) 进行映射。
我可以想象的唯一方法是将结构的每个字段定义为指针,否则您将始终返回一个初始化的结构。 因此,每个作为对象的 jsonString(即使是空的 {})都会返回一个初始化的结构,而您无法判断该 json 是否代表您的结构。
我能想到的唯一解决方案是很不舒服:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name *string `json:name`
Age *int `json:age`
Male *bool `json:male`
}
func main() {
var p *Person
err := json.Unmarshal([]byte("{}"), &p)
// handle parse error
if err != nil {
return
}
// handle json did not match error
if p.Name == nil || p.Age == nil || p.Male == nil {
return
}
// now use the fields with dereferencing and hope you did not forget a nil check
fmt.Println("Hello " + *p.Name)
}
也许可以使用govalidator 之类的库并使用SetFieldsRequiredByDefault。但是您仍然必须执行验证,并且您仍然需要对整个指针取消引用以进行值检索以及 nil 指针的风险。
我想要的是一个函数,如果字段不匹配,它可以将我未编组的 json 作为结构或错误返回。 golang json 库提供的唯一功能是在未知字段上失败但在缺少字段时不会失败。
有什么想法吗?
【问题讨论】:
-
您的解决方案有什么问题? Go 并不是要为每个可以封装成函数的用例提供魔法。编写一个可以做一些工作的函数并使用这个函数并不是“不舒服”。那么问题是什么?
-
我认为它不是很方便,而且我还没有看到很多只使用指向结构字段的指针,以及 nil 指针的所有取消引用和风险。关于魔法:“DisallowUnknownFields”是 json 标准库的一部分,那么为什么“DisallowMissingFields”不能呢?而且我不知道一个函数会是什么样子,它可以为所有结构通用地解决这个问题(因为我正在构建一个库)。
-
首先:指针在 Go 中并不少见。第二:将其包装成一个函数。您无需使用指针,您所要做的就是在解码期间使用它们,然后复制回“无指针”结构。很简单。
-
所以通用库的每个用户都必须提供两个结构,必须进行字段 == nil 检查,然后必须复制到另一个结构......非常直观。 :-)