我有一种情况,当请求由于某种原因失败时,服务器将使用json错误对象进行响应,服务器始终以HTTP 200进行响应。因此,如果我的令牌过期并且我请求用户信息,例如:
type Person struct { FirstName string LastName string }
相反,{"FirstName": "Bob", "LastName": "Smith"}
我得到了{"error":401, "msg":"Unauthorized"}
我有一个需要interface{}
解组的功能:
func (ah *APIHandler) getObjectFromJson(bodyResponse string, target interface{}) *ServerError {
parsingError := json.NewDecoder(strings.NewReader(bodyResponse)).Decode(target)
// when server responds with ServerError I expect to get persingError here and proceed to unmarshalling the error message
if parsingError != nil {
fmt.Println(parsingError.Error())
var err *ServerError = &ServerError{}
parsingError = json.NewDecoder(strings.NewReader(bodyResponse)).Decode(err)
if parsingError != nil {
// this means unmarshalling ServerError failed
panic(parsingError.Error())
}
return err
}
return nil
}
放入一个工作示例中,当我提供不正确的JSON来传递时,interface{}
我期望在控制台中收到“ JSON与结构不匹配”错误,而不是空结构。那可能吗?
我有50多个模型,因此理想情况下,我希望避免为每个模型编写解组器以检查字段是否已正确解组,而且我也想避免编写模型,if strings.Contains(responseBody, "error")
因为某些对象中可能包含字符串错误。
在解码时,标准库始终忽略未映射的字段。这就是您想要的,因为否则您将无法在不破坏这些模型的每个使用者的情况下向模型添加新字段。
而不是检查无法识别的字段,而是检查封送是否包含错误字段,方法是解封两次或通过除您期望的数据之外还分析错误字段。您已经做到了,但是反之亦然。
func (ah *APIHandler) getObjectFromJson(bodyResponse string, target interface{}) *ServerError {
b := []byte(bodyResponse)
se := &ServerError{}
if err := json.Unmarshal(b, &se); err != nil {
// ...
}
if se.Error != "" {
return se
}
if err := json.Unmarshal(b, target); err != nil {
// ...
}
return nil
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句