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

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

在 Go 中序列化混合類型的 JSON 數(shù)組

在 Go 中序列化混合類型的 JSON 數(shù)組

Go
慕尼黑8549860 2021-09-10 21:43:40
我想返回一個(gè)如下所示的結(jié)構(gòu):{    results: [        ["ooid1", 2.0, "S?me text"],        ["ooid2", 1.3, "?ther text"],    ]}這是一個(gè)字符串?dāng)?shù)組,浮點(diǎn)數(shù),unicode 字符。如果是 Python,我將能夠:import jsonjson.dumps({'results': [["ooid1", 2.0, u"S?me text"], ...])但是在 Go 中,您不能擁有混合類型的數(shù)組(或切片)。我想過使用這樣的結(jié)構(gòu):type Row struct {    Ooid string    Score float64    Text rune}但我不希望每個(gè)都成為字典,我希望它成為每個(gè)包含 3 個(gè)元素的數(shù)組。
查看完整描述

3 回答

?
江戶川亂折騰

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

我們可以通過實(shí)現(xiàn)json.Marshaler接口來自定義對(duì)象的序列化方式。對(duì)于我們的特殊情況,我們似乎有一個(gè)Row元素切片,我們希望將其編碼為一個(gè)異構(gòu)值數(shù)組。我們可以通過MarshalJSON在我們的Row類型上定義一個(gè)函數(shù)來做到這一點(diǎn),使用中間切片interface{}對(duì)混合值進(jìn)行編碼。


這個(gè)例子演示了:


package main


import (

    "encoding/json"

    "fmt"

)


type Row struct {

    Ooid  string

    Score float64

    Text  string

}


func (r *Row) MarshalJSON() ([]byte, error) {

    arr := []interface{}{r.Ooid, r.Score, r.Text}

    return json.Marshal(arr)

}


func main() {

    rows := []Row{

        {"ooid1", 2.0, "S?me text"},

        {"ooid2", 1.3, "?ther text"},

    }

    marshalled, _ := json.Marshal(rows)

    fmt.Println(string(marshalled))

}

當(dāng)然,我們也可能想反過來,從 JSON 字節(jié)回到結(jié)構(gòu)體。所以我們可以使用一個(gè)類似的json.Unmarshaler接口。


func (r *Row) UnmarshalJSON(bs []byte) error {

    arr := []interface{}{}

    json.Unmarshal(bs, &arr)

    // TODO: add error handling here.

    r.Ooid = arr[0].(string)

    r.Score = arr[1].(float64)

    r.Text = arr[2].(string)

    return nil

}

這使用了類似的技巧,首先使用 的中間切片interface{},使用解組器將值放入這個(gè)通用容器中,然后將值放回我們的結(jié)構(gòu)中。


package main


import (

    "encoding/json"

    "fmt"

)


type Row struct {

    Ooid  string

    Score float64

    Text  string

}


func (r *Row) UnmarshalJSON(bs []byte) error {

    arr := []interface{}{}

    json.Unmarshal(bs, &arr)

    // TODO: add error handling here.

    r.Ooid = arr[0].(string)

    r.Score = arr[1].(float64)

    r.Text = arr[2].(string)

    return nil

}


func main() {

    rows := []Row{}

    text := `

    [

          ["ooid4", 3.1415, "pi"],

          ["ooid5", 2.7182, "euler"]

        ]

    `

    json.Unmarshal([]byte(text), &rows)

    fmt.Println(rows)

}

您可以在此處閱讀完整示例。


查看完整回答
反對(duì) 回復(fù) 2021-09-10
?
qq_遁去的一_1

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

用 []interface{}


type Results struct {

     Rows []interface{} `json:"results"`

}

如果要訪問存儲(chǔ)在中的值,則必須使用類型斷言 []interface{}


for _, row := range results.Rows {

    switch r := row.(type) {

    case string:

        fmt.Println("string", r)

    case float64:

        fmt.Println("float64", r)

    case int64:

        fmt.Println("int64", r)

    default:

        fmt.Println("not found")

    } 

}


查看完整回答
反對(duì) 回復(fù) 2021-09-10
  • 3 回答
  • 0 關(guān)注
  • 286 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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