亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Go中解碼可變模式JSON

在Go中解碼可變模式JSON

Go
肥皂起泡泡 2021-05-03 16:48:47
我想問有關Go的問題encoding/json,但我想它也適用于將JSON Blob映射到任何語言的對象的任何其他JSON庫。這是一個例子。如果您想使用goo.gl URL Shortener 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中有可能。我可以解組到a 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    }}但這看起來很難看。我應該如何處理?
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

由于json響應中的字段彼此不同,因此您只需創建一個具有所有字段并集的結構即可。json解碼器將忽略json字符串中不存在的字段,并且您可以測試這些字段的存在,以了解要返回的響應類型。


查看完整回答
反對 回復 2021-05-17
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

我對此也感到困惑,并以為我必須再次對其進行解碼。不過你沒有。您只需要將interface {}數據類型轉換為適當的結構。

例如,如果JSON包已經把值轉換成通用的interface{},可以強制轉換成ErrorTypeerror := val.(ErrorType)

如果要根據值的類型進行解析,則可以foo.(type)switch語句中使用“做正確的事”。

我本周只學習Go,所以它不是最漂亮的代碼,但是geodns JSON配置解析中有一些示例。


查看完整回答
反對 回復 2021-05-17
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

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

}


查看完整回答
反對 回復 2021-05-17
  • 3 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號