Goについて質問してencoding/json
いますが、JSONブロブを任意の言語のオブジェクトにマップする他のJSONライブラリにも当てはまると思います。
これが例です。goo.gl URL Shortener 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"
}
}
これに対処する慣用的な方法はありますか?2つの完全に異なるスキーマに準拠する可能性のある応答ですか?
通常、私はマップ/リストを使用してJSONを扱います。私はそれが囲碁で可能であることを知っています。にマーシャリングを解除してからmap[string]interface{}
、マップに"error"
キーがあるかどうかを確認できます。しかし、それなら私は再び適切なものにデコードする必要struct
があると思います。(私が間違っている?)
私はこのようなことをしています。応答の種類ごとに1つのタイプがあります。
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
}
}
しかし、それはちょっと醜いようです。これにどのようにアプローチすればよいですか?