我问这个关于Go的编码/ json,但是我猜想它也适用于任何其他的
JSON库,将
JSON blob映射到任何语言的对象.
这是一个例子.如果要使用goo.gl URL shortener API缩短网址,您可以获得成功的回复:
{ "kind": "urlshortener#url","id": "http://goo.gl/fbsS","longUrl": "http://www.google.com/" }
或者一个错误响应:
{ "error": { "errors": [ { "domain": "global","reason": "@R_502_103@","message": "@R_502_103@","locationType": "parameter","location": "resource.longUrl" } ],"code": 400,"message": "@R_502_103@" } }
有没有一个惯用的方法来处理这个 – 一个可以坚持两个完全不同的模式的回应?
通常我使用地图/列表处理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字符串中不存在的字段,您可以测试字段的存在,以了解您要回复的响应类型.