2017-04-05 48 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{ 
     // ... 
    } 
}