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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

外部類型問題的 JSON 序列化 - 將 map[string]interface{} 項(xiàng)轉(zhuǎn)換為

外部類型問題的 JSON 序列化 - 將 map[string]interface{} 項(xiàng)轉(zhuǎn)換為

Go
拉丁的傳說 2022-05-23 17:12:24
我想序列化Dense包的類型gonum.org/v1/gonum/mat。因?yàn)槲覠o(wú)法實(shí)現(xiàn)外部類型的方法,所以我創(chuàng)建了一個(gè)類型type DenseEx struct {    Mtx *mat.Dense}并實(shí)現(xiàn)MarshalJSON方法如下func (d DenseEx) MarshalJSON() ([]byte, error) {    js := map[string]interface{}{}    rows, cols := d.Mtx.Dims()    js["cols"] = cols    js["rows"] = rows    fltVals := make([]float64, cols*rows)    for r := 0; r < rows; r++ {       for c := 0; c < cols; c++ {            i := r*cols + c            fltVals[i] = d.Mtx.At(r, c)        }    }  js["values"] = fltVals  return json.Marshal(js)}這按預(yù)期工作。現(xiàn)在我有解組結(jié)構(gòu)的問題。func (d DenseEx) UnmarshalJSON(data []byte) error {    js := map[string]interface{}{}    err := json.Unmarshal(data, &js)    if err != nil {        return err    }    intf, ok := js["cols"]    if !ok {        return fmt.Errorf("tag 'cols' missing in JSON data")    }    var cols, rows int    cols, ok = intf.(int)    if !ok {        return fmt.Errorf("tag 'cols' cannot be converted to int")    }    ...    return nil}我無(wú)法將標(biāo)簽的值轉(zhuǎn)換為正確的類型。我的測(cè)試 json 字符串是var jsonStrs = []struct {    str         string    expected    DenseEx    description string}{    {        str: "{\"cols\":3,\"rows\":2,\"values\":[6,1,5,2,4,3]}",        expected: DenseEx{            Mtx: nil,        },        description: "deserialization of a 2x3 matrice",    },}我的測(cè)試代碼是...for _, d := range jsonStrs {    var m DenseEx    err := m.UnmarshalJSON([]byte(d.str))...我總是得到結(jié)果matex_test.go:26: FAIL: deserialization of a 2x3 matrice: tag 'cols' cannot be converted to int有任何想法嗎?提前致謝!
查看完整描述

1 回答

?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

如果您查看 Unmarshal 的文檔。你會(huì)發(fā)現(xiàn) Unmarshal 中已知的 Numbers 類型是float64


為了將 JSON 解組為接口值,Unmarshal 將其中一項(xiàng)存儲(chǔ)在接口值中:


bool, for JSON booleans

float64, for JSON numbers

string, for JSON strings

[]interface{}, for JSON arrays

map[string]interface{}, for JSON objects

nil for JSON null

因此,當(dāng)您嘗試 Unmarshal an int 您將得到它作為 float 64。應(yīng)該先鍵入 assert 它float64 intf.(float64)然后將其轉(zhuǎn)換為int


例如 :


    intf, ok := js["cols"]

    if !ok {

        return fmt.Errorf("tag 'cols' missing in JSON data")

    }

    var cols, rows int


    ucols, ok := intf.(float64)

    if !ok {

        return fmt.Errorf("tag 'cols' cannot be converted to float64")

    } 


    cols = int(ucols)


查看完整回答
反對(duì) 回復(fù) 2022-05-23
  • 1 回答
  • 0 關(guān)注
  • 269 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)