在Go中解码变量模式JSON

前端之家收集整理的这篇文章主要介绍了在Go中解码变量模式JSON前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我问这个关于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字符串中不存在的字段,您可以测试字段的存在,以了解您要回复的响应类型.
原文链接:https://www.f2er.com/js/155062.html

猜你在找的JavaScript相关文章