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

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

高浪如何接受不確定的價值觀

高浪如何接受不確定的價值觀

Go
幕布斯6054654 2022-09-19 17:39:09
后端返回值不是固定的,有時:{"application": {"instance": [{"instanceId": "v1"}, {"instanceId": "v2"}]}}或者有時:{"application": {"instance": {"instanceId": "v"}}}我應該如何取出相應的實例 Id 值?package mainimport (    "encoding/json"    "fmt")type Application struct {    Application struct {        Instance json.RawMessage `json:"instance"`    } `json:"application"`}func main() {    a := `{"application": {"instance": {"instanceId": "v"}}}`    //a := `{"application": {"instance": [{"instanceId": "v1"}, {"instanceId": "v2"}]}} `    var p Application    errJson := json.Unmarshal([]byte(a), &p)    if errJson != nil {        fmt.Printf("errJson")    }    fmt.Printf("type:%T", p.Application.Instance)}
查看完整描述

2 回答

?
幕布斯7119047

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

由于 2 種值類型發生沖突(一種是結構,另一種是結構的一部分),因此即使使用捕獲所有解決方案(如 ),將其封裝到單個類型中也會變得很混亂。interface{}


最簡單的解決方案是呈現兩種不同的類型并封送到其中任何一個,以查看哪個“有效”:


func unmarsh(body []byte) (*type1, *type2, error) {

    var (

        t1 type1

        t2 type2

    )


    err := json.Unmarshal(body, &t1)

    if err == nil {

        return &t1, nil, nil

    }


    err = json.Unmarshal(body, &t2)

    if err == nil {

        return nil, &t2, nil

    }


    return nil, nil, err


}

在您的示例中,兩種類型將是:


type type1 struct {

    Application struct {

        Instance []struct {

            InstanceID string `json:"instanceId"`

        } `json:"instance"`

    } `json:"application"`

}


type type2 struct {

    Application struct {

        Instance struct {

            InstanceID string `json:"instanceId"`

        } `json:"instance"`

    } `json:"application"`

}

工作示例:https://play.golang.org/p/Kma32gWfghb


查看完整回答
反對 回復 2022-09-19
?
慕的地10843

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

一個更干凈的解決方案是自定義的拆包器:


type Instances []Instance


func (i *Instances) UnmarshalJSON(in []byte) error {

   if len(in)>0 && in[0]=='[' {

     var a []Instance

     if err:=json.Unmarshal(in,&a); err!=nil {

        return err

     }

     *i=a

     return nil

  }

  var s Instance

  if err:=json.Unmarshal(in,&s) ; err!=nil {

     return err

  }

  *i=[]Instance{s}

  return nil

}

這會將對象解封為 1 的切片。


@mkopriva提供了更緊湊的解決方案:


func (i *Instances) UnmarshalJSON(in []byte) error {

    if len(in) > 0 && in[0] == '[' {

        return json.Unmarshal(in, (*[]Instance)(i))

    }


    *i = Instances{{}}

    return json.Unmarshal(in, &(*i)[0])

}


查看完整回答
反對 回復 2022-09-19
  • 2 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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