在Go中解码变量模式JSON

前端之家收集整理的这篇文章主要介绍了在Go中解码变量模式JSON前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我问这个关于Go的编码/ json,但是我猜想它也适用于任何其他的 JSON库,将 JSON blob映射到任何语言的对象.

这是一个例子.如果要使用goo.gl URL shortener API缩短网址,您可以获得成功的回复

  1. {
  2. "kind": "urlshortener#url","id": "http://goo.gl/fbsS","longUrl": "http://www.google.com/"
  3. }

或者一个错误响应:

  1. {
  2. "error": {
  3. "errors": [
  4. {
  5. "domain": "global","reason": "required","message": "required","locationType": "parameter","location": "resource.longUrl"
  6. }
  7. ],"code": 400,"message": "required"
  8. }
  9. }

有没有一个惯用的方法来处理这个 – 一个可以坚持两个完全不同的模式的回应?

通常我使用地图/列表处理JSON;我知道这是可能的.我可以取消对地图[string] interface {}的修饰,然后检查地图是否具有“错误”作为键.但是,我想,我必须再次解码为一个正确的结构. (我错了吗?)

我在做这样的事情我有一种类型的每种回应:

  1. type successResponse struct {
  2. Kind string
  3. Id string
  4. LongUrl string
  5. }
  6.  
  7. type errorResponse struct {
  8. Error struct {
  9. Errors []struct {
  10. Domain string
  11. Reason string
  12. Message string
  13. LocationType string
  14. Location string
  15. }
  16. Code int
  17. Message string
  18. }
  19. }

解码看起来像这样:

  1. s := new(successResponse)
  2. err := json.Unmarshal(blob,s)
  3. if err == nil {
  4. // handle success
  5. } else {
  6. e := new(errorResponse)
  7. err = json.Unmarshal(blob,e)
  8. if err == nil {
  9. // handle error response
  10. } else {
  11. // handle actual error
  12. }
  13. }

但这似乎是一种丑陋.我该怎么办?

解决方法

由于json响应中的字段彼此不同,您可以使用所有字段的并集创建一个结构体. json解码器将忽略json字符串中不存在的字段,您可以测试字段的存在,以了解您要回复的响应类型.

猜你在找的JavaScript相关文章