第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何解組不同的json格式

如何解組不同的json格式

Go
寶慕林4294392 2022-06-27 15:47:00
我讀了很多類似的問題,但還沒有找到正確的解決方案。希望有人能給我更好的主意。我的錯誤響應可能是以下格式之一:var errProxy = `{"errors":{"id": "1", "message": "failed to resolve the ip", "status": "failed"}}`var errServer = `{"errors": "failed to ping the dns server."}`我試圖通過使用兩個結構來解決這個問題,并嘗試一個接一個地解組,直到 err 為 nil 并返回:// ErrorServer and ErrorProxy is my two struct to represent my above two error response.type ErrorServer struct {    Error string `json:"errors"`}type ErrorResponse struct {    ID      string `json:"id"`    Message string `json:"message"`    Status  string `json:"status"`}type ErrorProxy struct {    ErrorResponse}這是我用來解析它的函數(shù):func parseErrorResponse(body io.ReadCloser) (string, error) {    var errServer ErrorServer    var errProxy ErrorProxy    err := json.NewDecoder(body).Decode(&errServer)    if err != nil {        err = json.NewDecoder(body).Decode(&errProxy)        if err != nil {            return "", err        }        return errProxy.Error, nil    }    return errServer.Errors, nil}
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經(jīng)驗 獲得超3個贊

我認為自定義解組功能適用于這種情況


type ErrorServer struct {

    Error string

}


type ErrorResponse struct {

    ID      string

    Message string

    Status  string

}

type ErrorProxy struct {

    Err ErrorResponse

}


func parseErrorResponse(body io.Reader) (interface{}, error) {

    data := make(map[string]interface{})

    if err := json.NewDecoder(body).Decode(&data); err != nil {

        return nil, err

    }

    // Check type of errors field

    switch errors := data["errors"].(type) {

    case string:

        // Unmarshal for ErrorServer

        errServer := &ErrorServer{

            Error: errors,

        }

        return errServer, nil

    case map[string]interface{}:

        // Unmarshal for ErrorProxy

        errProxy := &ErrorProxy{

            Err: ErrorResponse{

                ID:      errors["id"].(string),

                Message: errors["message"].(string),

                Status:  errors["status"].(string),

            },

        }

        return errProxy, nil

    default:

        return nil, fmt.Errorf(`failed to parse "errors" field`)

    }

}


func main() {

    body := bytes.NewReader([]byte(`{"errors": "failed to ping the dns server."}`))

    //body := bytes.NewReader([]byte(`{"errors":{"id": "1", "message": "failed to resolve the ip", "status": "failed"}}`))

    

    parsedErr, _ := parseErrorResponse(body)


    switch err := parsedErr.(type) {

    case *ErrorServer:

        fmt.Printf("err server: %+v \n", err)

    case *ErrorProxy:

        fmt.Printf("err response: %+v \n", err)

    }

}


查看完整回答
反對 回復 2022-06-27
?
森林海

TA貢獻2011條經(jīng)驗 獲得超2個贊

另一種方法是使用類型斷言。您可以將該 json 字符串解組為map[string]interface{}并檢查該值interface{}是 astring還是map[string]interface{}。取決于它的類型,您知道它是哪種錯誤并從中構造一個結構。



查看完整回答
反對 回復 2022-06-27
?
慕蓋茨4494581

TA貢獻1850條經(jīng)驗 獲得超11個贊

有趣的是,我只是在這里給出了這個問題的答案:使用自定義UnmarshalJSON函數(shù)。你如何在 Golang 中修改這個結構來接受兩個不同的結果?


適用于您的情況:


package main


import (

    "encoding/json"

    "fmt"

    "log"

)


type Answer struct {

    Errors Error `json:"errors"`

}


type ErrorResponse struct {

    ID      string `json:"id"`

    Message string `json:"message"`

    Status  string `json:"status"`

}


type Error struct {

    Error         string

    ErrorResponse ErrorResponse

}


func (s *Error) UnmarshalJSON(b []byte) error {

    if len(b) == 0 {

        // no data, nothing to do

        return nil

    }

    if b[0] == '{' {

        // is object

        return json.Unmarshal(b, &s.ErrorResponse)

    }

    return json.Unmarshal(b, &s.Error)

}


func main() {

    var errProxy = []byte(`{"errors":{"id": "1", "message": "failed to resolve the ip", "status": "failed"}}`)

    var errServer = []byte(`{"errors": "failed to ping the dns server."}`)


    var answ Answer

    if err := json.Unmarshal(errProxy, &answ); err != nil {

        log.Fatal(err)

    }

    fmt.Println(answ)


    answ = Answer{}

    if err := json.Unmarshal(errServer, &answ); err != nil {

        log.Fatal(err)

    }

    fmt.Println(answ)

}


去游樂場


上面示例中的關鍵是包含兩種變體的類型。我們還可以簡化這一點,因為這兩個錯誤都可以包含在ErrorResponse類型中:


type Answer struct {

    Errors ErrorResponse `json:"errors"`

}


type ErrorResponse struct {

    ID      string

    Message string

    Status  string

}


func (s *ErrorResponse) UnmarshalJSON(b []byte) error {

    if len(b) == 0 {

        // no data, nothing to do

        return nil

    }

    if b[0] == '{' {

        // is object

        var tmp struct {

            ID      string `json:"id"`

            Message string `json:"message"`

            Status  string `json:"status"`

        }

        if err := json.Unmarshal(b, &tmp); err != nil {

            return err

        }

        s.ID = tmp.ID

        s.Message = tmp.Message

        s.Status = tmp.Status

        return nil

    }

    return json.Unmarshal(b, &s.Message)

}

Error這里不需要該結構。


查看完整回答
反對 回復 2022-06-27
  • 3 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號