[英]Decoding variable-schema JSON in Go
我問這個關於Go的encoding/json
,但我想它也適用於將JSON blob映射到任何語言的對象的任何其他JSON庫。
這是一個例子。 如果您想使用goo.gl URL縮短程序API縮短URL ,則可以獲得成功的響應:
{
"kind": "urlshortener#url",
"id": "http://goo.gl/fbsS",
"longUrl": "http://www.google.com/"
}
或錯誤響應:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Required",
"locationType": "parameter",
"location": "resource.longUrl"
}
],
"code": 400,
"message": "Required"
}
}
有沒有一種慣用的處理方式 - 一種可以遵循兩種完全不同的模式的響應?
通常我使用地圖/列表來處理JSON; 我知道Go中有可能。 我可以解組map[string]interface{}
,然后檢查地圖是否有"error"
作為鍵。 但是我認為我必須再次解碼成一個合適的struct
。 (我錯了嗎?)
我正在做這樣的事情。 我對每種響應都有一種類型:
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字符串中不存在的字段,您可以測試字段的存在以了解您要返回的響應類型。
我也對此感到困惑,並認為我必須再次解碼它。 但是,你沒有。 您只需將接口{}數據類型轉換為適當的結構即可。
例如,如果json包已將值放入通用interface{}
,則可以將其類型轉換為ErrorType
, error := val.(ErrorType)
。
如果要根據值的類型進行解析,可以在switch
語句中使用foo.(type)
來“做正確的事”。
我本周才學習Go,所以它不是最漂亮的代碼,但是在geodns JSON配置解析中有一些例子。
你試過Go-SimpleJSON嗎? 我認為這可能會解決您的問題。
type Response struct {
Kind string
Id string
LongUrl string
Error struct {
Errors []struct {
Domain string
Reason string
Message string
LocationType string
Location string
}
Code int
Message string
}
}
s := Response{}
if err := json.Unmarshal(blob, &s); err == nil {
if s.Error == nil {
// success
} else {
// error
}
} else {
// something went wrong
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.