Umarshal JSON响应Go中的两个结构类型之一

时间:2017-06-28 20:36:38

标签: json go unmarshalling

我正在使用第三方API端点,该端点可以为相同的HTTP状态代码返回两个顶级JSON对象之一。我对目前为止找到的解决方案不满意,所以我想出了使用嵌入式类型的以下解决方案:

type TokenError struct {
    Error            string `json:"error"`
    ErrorDescription string `json:"error_description"`
}

type Token struct {
    AccessToken string `json:"access_token"`
    ExpiresIn   int    `json:"expires_in"`
    TokenType   string `json:"token_type"`
}

type TokenResponse struct {
    *TokenError
    *Token
}

使用上述类型,我可以进行单一的解组和一些简单的检查:

var tokenResponse TokenResponse
err = json.Unmarshal(body, &tokenResponse)
if err != nil {
    fmt.Printf("Error parsing response %+v\n", err)
}

if tokenResponse.TokenError != nil {
    fmt.Printf("Error fetching token: %+v\n", tokenResponse.TokenError)
    return
}

if tokenResponse.Token != nil {
    fmt.Printf("Successfully got token: %+v\n", tokenResponse.Token)
    return
}

我想知道以下内容:

  • 出于某种原因,这是一种反模式还是糟糕的设计? (假设我没有在包外面公开TokenResponse类型...)
  • 我忽略了这个问题的解决方案吗?

0 个答案:

没有答案