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

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

具有靈活類型的 JSON 解碼

具有靈活類型的 JSON 解碼

Go
翻閱古今 2021-06-30 03:06:49
我需要以靈活的方式指定用于解碼 JSON 數據的類型,這意味著需要在運行時指定類型??紤]這個片段:http : //play.golang.org/p/F-Jy4ufMPzs := `{"b":[{"x":9},{"x":4}]}`var a struct {  B []interface{}}err := json.Unmarshal([]byte(s), &a)if err != nil {  panic(err)}fmt.Println(a)這將產生{[map[x:9] map[x:4]]}. 我想解碼為特定(結構)類型的數組而不是[]interface{},而不在編譯時指定它。在不預先創建數組的情況下以某種方式可能嗎?(退貨數量未知)我現在能想到的唯一方法是稍后再次對返回的映射進行編碼,并將它們解碼為指定的類型,這會產生不必要的處理開銷。
查看完整描述

1 回答

?
子衿沉夜

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

如果在編譯時沒有指定它,您仍然需要在某處指定它。


如果在檢索 Json 數據之前指定,您可以簡單地做一個 switch case,將它解組到您想要的對象。


如果在Json 數據中指定,則可以json.RawMessage在確定適合哪種類型的結構后將“靈活”部分編組到 a 中以進行處理:


package main


import (

    "encoding/json"

    "fmt"

)


var s = `{"type":"structx", "data":{"x":9,"xstring":"This is structX"}}`


type JsonStruct struct {

    Type string

    Data json.RawMessage

}


type StructX struct {

    X       float64

    Xstring string

}


type StructY struct {

    Y bool

}


func main() {

    var a *JsonStruct

    err := json.Unmarshal([]byte(s), &a)

    if err != nil {

        panic(err)

    }


    switch a.Type {

    case "structx":

        // We Unmashal the RawMessage part into a StructX

        var s *StructX

        json.Unmarshal([]byte(a.Data), &s)

        if err != nil {

            panic(err)

        }

        fmt.Println(s)

    case "structy":

        // Do the same but for structY

    }

}


查看完整回答
反對 回復 2021-07-05
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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