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

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

在go中創(chuàng)建異構(gòu)json數(shù)組

在go中創(chuàng)建異構(gòu)json數(shù)組

Go
慕工程0101907 2023-05-08 17:52:37
假設(shè)我有一個(gè)這樣的結(jié)構(gòu):type Message struct {    Args   []interface{}    Kwargs map[string]interface{}}message := Message{                                                                                                                                                                                                []interface{}{1, 2, 3, 4},                                                                                                                                                                                     map[string]interface{}{"a": 2, "b": 3},                                                                                                                                                                    }我應(yīng)該如何編組消息以獲得這樣的 JSON?[[1,2,3,4], {"a": 2, "b":3}]
查看完整描述

2 回答

?
慕姐4208626

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

您可以向您的結(jié)構(gòu)添加一個(gè)編組方法來處理邏輯。在行的東西


func (m Message) MarshalJSON() ([]byte, error) {

    data := make([]interface{}, 0)

    data = append(data, m.Args)

    data = append(data, m.Kwargs)

    return json.Marshal(data)

}


在操場上試試


查看完整回答
反對 回復(fù) 2023-05-08
?
慕虎7371278

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

您在輸出中想要的是一個(gè) JSON 數(shù)組,其中包含您的結(jié)構(gòu)值的Args和字段,因此您可以通過編組以下切片值來獲得您想要的內(nèi)容:Kwargsmessage


[]interface{}{message.Args, message.Kwargs}

例如:


message := Message{

    []interface{}{1, 2, 3, 4},

    map[string]interface{}{"a": 2, "b": 3},

}


err := json.NewEncoder(os.Stdout).

    Encode([]interface{}{message.Args, message.Kwargs})


fmt.Println(err)

上面的輸出(在Go Playground上試試):


[[1,2,3,4],{"a":2,"b":3}]

<nil>

這適用于這種特定情況。如果你想要一個(gè)像數(shù)組元素一樣編組結(jié)構(gòu)值字段的通用解決方案,你可以創(chuàng)建一個(gè)輔助函數(shù),將字段“打包”到一個(gè)切片中:


func getFields(i interface{}) (res []interface{}) {

    v := reflect.ValueOf(i)

    if v.Kind() == reflect.Ptr {

        v = v.Elem()

    }

    if v.Kind() != reflect.Struct {

        return nil

    }


    for i := 0; i < v.NumField(); i++ {

        f := v.Field(i)

        if f.CanInterface() {

            res = append(res, f.Interface())

        }

    }

    return res

}

以上getFields()接受結(jié)構(gòu)值和指向結(jié)構(gòu)的指針。使用它的例子:


message := Message{

    []interface{}{1, 2, 3, 4},

    map[string]interface{}{"a": 2, "b": 3},

}


err := json.NewEncoder(os.Stdout).Encode(getFields(message))

fmt.Println(err)


err = json.NewEncoder(os.Stdout).Encode(getFields(&message))

fmt.Println(err)

輸出(在Go Playground上嘗試):


[[1,2,3,4],{"a":2,"b":3}]

<nil>

[[1,2,3,4],{"a":2,"b":3}]

<nil>


查看完整回答
反對 回復(fù) 2023-05-08
  • 2 回答
  • 0 關(guān)注
  • 211 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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