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

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

解碼地圖和數組 json

解碼地圖和數組 json

Go
陪伴而非守候 2022-03-02 13:35:10
如果沒有項目,外部 API 返回空數組:{"items":[]}...或帶有項目的地圖:{"items":{"1": {...}, "2": {...}}}我怎樣才能解碼它們?我嘗試使用這個結構:var response struct {     Items map[string]Item     Array []Item `json:"items"`     }但它不起作用。更新:最好如果(數組和對象)都會產生map[string]Item(空的和填充的)
查看完整描述

2 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

如果您需要解組為變量類型,最簡單的方法是解組為 amap[string]interface{}和類型斷言(或在本例中為類型切換)。


func Unmarshal(data []byte) (map[string]Item, error) {

    var d struct {

        Items interface{} `json:"items"`

    }

    if err := json.Unmarshal(data, &d); err != nil {

        return nil, err

    }

    switch dv := d.Items.(type) {

    case []interface{}:

        if len(dv) == 0 {

            return nil, nil

        }

    case map[string]interface{}:

        m := make(map[string]Item)

        for k, v := range dv {

            m[k] = Item(v)

        }

        return m, nil

    }

    // fallthrough return if different type, or non-empty array

    // Could have put this in a default case, but this catches non-empty arrays too

    return nil, fmt.Errorf("unexpected type in json")

}

這是一個示例,顯示它適用于您提供的兩個示例: https: //play.golang.org/p/c0oZX2-xpN


查看完整回答
反對 回復 2022-03-02
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

試試這個工作代碼(A):


package main


import (

    "encoding/json"

    "fmt"

)


type Item int


type response struct {

    Items map[string]Item `json:"Items"`

    Array []Item          `json:"Array"`

}


func main() {

    var d response

    err := json.Unmarshal([]byte(`{"Items":{"A":1,"B":2,"C":3},"Array":[]}`), &d)

    if err != nil {

        panic(err)

    }

    fmt.Println(d)

}

輸出:


{map[C:3 A:1 B:2] []}

試試這個工作代碼(B):


package main


import (

    "encoding/json"

    "fmt"

)


type Item int


type response struct {

    Items map[string]Item `json:"Items"`

    //Array []Item          `json:"Array"`

}


func main() {

    var d response

    err := json.Unmarshal([]byte(`{"Items":{"A":1,"B":2,"C":3},"Array":[]}`), &d)

    if err != nil {

        panic(err)

    }

    fmt.Println(d)

}

輸出:


{map[C:3 A:1 B:2]} 

您可以使用json.Marshaland json.Unmarshal,就像這個工作代碼 (C):


package main


import (

    "encoding/json"

    "fmt"

)


type Item int


type response struct {

    Items map[string]Item `json:"Items"`

    Array []Item          `json:"Array"`

}


func main() {

    var test = response{

        Items: map[string]Item{"A": 1, "B": 2, "C": 3},

        Array: []Item{},

    }

    body, err := json.Marshal(test)

    if err != nil {

        panic(err)

    }

    fmt.Println(string(body)) // {"Items":{"A":1,"B":2,"C":3},"Array":[]}


    var d response

    err = json.Unmarshal(body, &d)

    if err != nil {

        panic(err)

    }

    fmt.Println(d)

}

輸出:


{"Items":{"A":1,"B":2,"C":3},"Array":[]}

{map[A:1 B:2 C:3] []}

您可以 Unmarshal {"A":1,"B":2,"C":3}tomap[A:1 B:2 C:3]

和 "[1,2,3]"to [1 2 3],就像這個工作代碼(D):


package main


import (

    "encoding/json"

    "fmt"

)


type Item int


type response1 map[string]Item

type response2 []Item


func main() {

    var d response1

    err := json.Unmarshal([]byte(`{"A":1,"B":2,"C":3}`), &d)

    if err != nil {

        panic(err)

    }

    fmt.Println(d) // map[A:1 B:2 C:3]


    var d2 response2

    err2 := json.Unmarshal([]byte(`[1,2,3]`), &d2)

    if err2 != nil {

        panic(err2)

    }

    fmt.Println(d2) // [1 2 3]

}

輸出:


map[A:1 B:2 C:3]

[1 2 3]


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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