我正在编写一个解析JSON对象的函数。我想发出结构化错误消息,指出哪些特定字段中存在错误。
最初,我检查了错误类型是否为*json.UnmarshalTypeError
,然后从其Field
属性中检索了json标记名称。不幸的是,如果我解组JSON的结构具有实现自己的UnmarshalJSON
函数的自定义类型,则会失败。他们返回的错误是我的自定义错误,无法确定它们来自哪个结构域。
Playground对比内置vs自定义错误:https://play.golang.org/p/auH3PE7j5H
此时我正在考虑更改为使用反射,最初将对象解组为json.RawMessage
的地图,然后一次解组一个字段,以便我可以识别有问题的字段。有没有更简单的方法?这将要求我基本上复制内部json包逻辑以分析json标记,以找出将每条原始消息解组成哪个字段。
答案 0 :(得分:1)
json.UnmarshalTypeError
及其所有字段。您无法从自定义封送程序返回此错误类型。事实上,我冒昧这是这种类型的预期用途!
func (third *Second) UnmarshalJSON(data []byte) error {
return &json.UnmarshalTypeError{
// ...
}
}