簡體   English   中英

鍵入斷言嵌套接口

[英]Type assert a nested interface

json.Unmarshal JSON到interface{} 我無法輸入斷言。 http://play.golang.org/p/NAe8voYnb8

package main

import (
    "encoding/json"
    "log"
)

func main() {
    b := []byte(`{"key1":[
                          {"apple":"A", "banana":"B", "id": "C"},
                          {"cupcake": "C", "pinto":"D"}
                         ]
                  }`)

    var data interface{}
    _ = json.Unmarshal(b, &data)

    log.Println(data)
    // map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]

    ndata, ok := data.(map[string][]map[string]string)
    log.Println(ok, ndata)
    // false map[]

    key_data, ok := ndata["key1"].([]map[string]string)
    log.Println(ok, key_data)
    // false []
}

誰知道怎么了?

例如,

package main

import (
    "encoding/json"
    "log"
)

func somefunc(data interface{}) {
    log.Printf("%T\n", data)
    // Prints: map[string]interface {}
    log.Println(data)
    // Correctly prints: map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]

    ndata, _ := data.(map[string]interface{})
    log.Println(ndata)
    // Should print: map[key1:[map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]

    key_data, _ := ndata["key1"]
    log.Println(key_data)
    // Should print: [map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
}

func main() {
    b := []byte(`{"key1":[{"apple":"A", "banana":"B", "id": "C"},{"cupcake": "C", "pinto":"D"}]}`)
    var m interface{}
    _ = json.Unmarshal(b, &m)
    somefunc(m)
}

輸出:

2012/10/18 18:21:43 map[string]interface {}
2012/10/18 18:21:43 map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
2012/10/18 18:21:43 map[key1:[map[banana:B apple:A id:C] map[pinto:D cupcake:C]]]
2012/10/18 18:21:43 [map[banana:B apple:A id:C] map[pinto:D cupcake:C]]

如果您需要一種簡單的方法來處理嵌套的JSON數據,我已經編寫了一個包來做到這一點: https//github.com/opesun/jsonp

這減輕了必須在每個級別鍵入斷言的痛苦。 請參閱文檔以獲取說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM