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

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

解組 json 時處理不同類型

解組 json 時處理不同類型

Go
守候你守候我 2023-06-12 17:18:10
我正在使用一個端點(我不擁有并且無法修復)并且該端點返回 JSON。問題是這個 JSON 可以有不同的格式:格式一:{   "message": "Message"  }或者{   "message": ["ERROR_CODE"] }取決于發生了什么。我想要一個結構來保存此響應,以便稍后我可以檢查它是message字符串還是數組,并正確地遵循流程。有可能在圍棋中做到嗎?我認為的第一種方法是有兩個結構并嘗試解碼為帶有 的結構string,如果發生錯誤,則嘗試解碼為帶有 的結構array。有沒有更優雅的方法?
查看完整描述

3 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

將其解組為類型值interface{},并使用類型斷言或類型開關來檢查最終值的類型。請注意,默認情況下,JSON 數組被解組為 type 的值[]interface{},因此您必須檢查它以檢測錯誤響應。

例如:


type Response struct {

? ? Message interface{} `json:"message"`

}


func main() {

? ? inputs := []string{

? ? ? ? `{"message":"Message"}`,

? ? ? ? `{"message":["ERROR_CODE"]}`,

? ? }


? ? for _, input := range inputs {

? ? ? ? var r Response

? ? ? ? if err := json.Unmarshal([]byte(input), &r); err != nil {

? ? ? ? ? ? panic(err)

? ? ? ? }

? ? ? ? switch x := r.Message.(type) {

? ? ? ? case string:

? ? ? ? ? ? fmt.Println("Success, message:", x)

? ? ? ? case []interface{}:

? ? ? ? ? ? fmt.Println("Error, code:", x)

? ? ? ? default:

? ? ? ? ? ? fmt.Println("Something else:", x)

? ? ? ? }

? ? }

}

輸出(在Go Playground上嘗試):


Success, message: Message

Error, code: [ERROR_CODE]


查看完整回答
反對 回復 2023-06-12
?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

您可以使用自定義類型依次實現json.Unmarshaller并嘗試解碼每種可能的輸入格式:


type Message struct {

? ? Text string

? ? Codes []int

}


func (m *Message) UnmarshalJSON(input []byte) error {

? ? var text string

? ? err := json.Unmarshal(input, &text)

? ? if err == nil {

? ? ? ? m.Text = text

? ? ? ? m.Codes = nil

? ? ? ? return nil

? ? }


? ? var codes []int

? ? err := json.Unmarshal(input, &codes)

? ? if err == nil {

? ? ? ? m.Text = nil

? ? ? ? m.Codes = codes

? ? ? ? return nil

? ? }


? ? return err

}

我更喜歡這種方法,而不是稍后解組interface{}和類型斷言,因為所有類型檢查都封裝在解組步驟中。



查看完整回答
反對 回復 2023-06-12
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我建議為Message創建一個不同的類型并制作那個實現json.Unmarshaller


這是代碼的樣子


type message struct {

? ? Text? string

? ? Codes []string //or int , assuming array of string as it was not mentioned in the question

}


func (m *message) UnmarshalJSON(input []byte) error {

? ? if len(input) == 0 {

? ? ? ? return nil

? ? }

? ? switch input[0] {

? ? case '"':

? ? ? ? m.Text = strings.Trim(string(input), `"`)

? ? ? ? return nil

? ? case '[':

? ? ? ? return json.Unmarshal(input, &m.Codes)

? ? default:

? ? return fmt.Errorf(`invalid character %q looking for " or [`, input[0])


? ? }

}


type Error struct {

? ? Message message `json:"message"`

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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