2017-04-05 93 views
1

我在写一个解析JSON对象的函数。我想发出结构化错误消息,指出哪些特定字段中有错误。从自定义json Umarshaller返回的错误缺少上下文

最初我检查错误类型是否为*json.UnmarshalTypeError,然后从其Field属性中检索到json标记名称。不幸的是,如果解构JSON的结构具有自定义类型来实现它们自己的UnmarshalJSON函数,那么这会失败。他们返回的错误是我的自定义错误,并且无法确定它们来自哪个结构的字段。

游乐场对比内置在VS中的自定义错误:https://play.golang.org/p/auH3PE7j5H

在这一点上,我正在考虑换用反射,解组对象变成地图json.RawMessage开始,然后在同一时间,使解编一个我场可以识别有问题的字段。有没有更简单的方法?这将需要我基本上复制内部json软件包逻辑来分析json标签以找出将每个原始消息解组到哪个字段。

+0

为什么不返回'* json.UnmarshalTypeError'? – JimB

+0

@JimB工作,谢谢!如果可以的话,我会接受这个答案。 这是一个更新的例子:https://play.golang.org/p/SXCHEkEp0Z – abc

回答

1

json.UnmarshalTypeError以及其所有字段均已导出。没有理由不能从您的自定义封送拆分器中返回此错误类型。事实上,我敢打赌,这是一个预定用途这种类型!

func (third *Second) UnmarshalJSON(data []byte) error { 
    return &json.UnmarshalTypeError{ 
     // ... 
    } 
}