我问这个关于 Go 的问题encoding/json
,但我想它也适用于任何其他将 JSON blob 映射到任何语言的对象的 JSON 库。
这是一个例子。如果您想使用goo.gl URL 缩短 API来缩短 URL ,您会得到一个成功的响应:
{
"kind": "urlshortener#url",
"id": "http://goo.gl/fbsS",
"longUrl": "http://www.google.com/"
}
或错误响应:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Required",
"locationType": "parameter",
"location": "resource.longUrl"
}
],
"code": 400,
"message": "Required"
}
}
有没有一种惯用的方法来处理这个问题——一种可以遵循两种完全不同模式的响应?
通常我使用地图/列表来处理 JSON;我知道这在 Go 中是可能的。我可以解组到 amap[string]interface{}
然后检查地图是否"error"
作为键。但是,我认为我必须再次解码为适当的struct
。(我错了吗?)
我正在做这样的事情。对于每种响应,我都有一种类型:
type successResponse struct {
Kind string
Id string
LongUrl string
}
type errorResponse struct {
Error struct {
Errors []struct {
Domain string
Reason string
Message string
LocationType string
Location string
}
Code int
Message string
}
}
解码看起来像这样:
s := new(successResponse)
err := json.Unmarshal(blob, s)
if err == nil {
// handle success
} else {
e := new(errorResponse)
err = json.Unmarshal(blob, e)
if err == nil {
// handle error response
} else {
// handle actual error
}
}
但这似乎有点丑陋。我应该如何处理这个?