我问这个关于Go的编码/ json,但是我猜想它也适用于任何其他的
JSON库,将
JSON blob映射到任何语言的对象.
这是一个例子.如果要使用goo.gl URL shortener API缩短网址,您可以获得成功的回复:
- {
- "kind": "urlshortener#url","id": "http://goo.gl/fbsS","longUrl": "http://www.google.com/"
- }
或者一个错误响应:
有没有一个惯用的方法来处理这个 – 一个可以坚持两个完全不同的模式的回应?
通常我使用地图/列表处理JSON;我知道这是可能的.我可以取消对地图[string] interface {}的修饰,然后检查地图是否具有“错误”作为键.但是,我想,我必须再次解码为一个正确的结构. (我错了吗?)
我在做这样的事情我有一种类型的每种回应:
- 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
- }
- }
但这似乎是一种丑陋.我该怎么办?
解决方法
由于json响应中的字段彼此不同,您可以使用所有字段的并集创建一个结构体. json解码器将忽略json字符串中不存在的字段,您可以测试字段的存在,以了解您要回复的响应类型.