2016-06-11 119 views
1

使用Golang的json.Unmarshal()函數解組一個json字符串時,我總是將該字符串解組爲一個map [string] interface {}。 我不確定天氣有沒有更好的解碼json的方法。Golang檢查接口類型是否爲

爲了說明問題,有時我解組的json類型是nil,而不是string(或int等)。這總是會引發恐慌,說「接口轉換:接口是零,不是int」。我該如何避免這種恐慌或檢查接口的類型是否爲零?

這是我行動的問題的一個例子:主要存在的,而不是讓它恐慌https://play.golang.org/p/0ATzXBbdoS

回答

1

檢查是。

func keyExists(decoded map[string]interface{}, key string) { 
    val, ok := decoded[key] 
    return ok && val != nil 
} 

func main() { 

jsonText := `{ 
     "name": "Jimmy", 
     "age": 23 
    }` 

    var decoded map[string]interface{} 

    if err := json.Unmarshal([]byte(jsonText), &decoded); err != nil { 
     fmt.Println(err) 
     os.Exit(0) 
    } 

    if keyExists(decoded, "name") { 
     fmt.Println(decoded["name"].(string)) 
    } 
    if keyExists(decoded, "age") { 
     fmt.Println(decoded["age"].(float64)) 
    } 
    if keyExists(decoded, "gender") { 
     fmt.Println(decoded["gender"].(int)) 
    } 
} 

另外,如果你知道你的json是什麼樣子的話,這還不是最優的。如文檔中所述,您可以將其直接解組爲一個結構:

type Human struct { 
    Name string 
    Age int 
    Gender int 
} 

func main() { 
    jsonText := `{ 
     "name": "Jimmy", 
     "age": 23 
    }` 

    decoded := Human{} 

    if err := json.Unmarshal([]byte(jsonText), &decoded); err != nil { 
     fmt.Println(err) 
     os.Exit(0) 
    } 

    fmt.Println(decoded.Name) 
    fmt.Println(decoded.Age) 
    fmt.Println(decoded.Gender) 
} 
+0

我有一個關於定義一個結構並提取json的問題。如果我想讓一些json看起來像:{「name」:「Jimmy」,「traits」:{「age」:23,「gender」:0}} ...如何定義值「age」和結構中的「性別」?這裏有一個你可以從中解答我的問題的地方:https://play.golang.org/p/TyXbrFAtGo – Acidic

+1

製作一個包含'age'和'gender'的嵌套結構'Traits'。另外,請閱讀[encoding/json](https://godoc.org/encoding/json#Marshal)軟件包的文檔 –

+1

感謝您的快速回復。對於任何有興趣的人,以下是我如何解決我的問題:https://play.golang.org/p/mq5XL47msM – Acidic

相關問題