interface{}類型通過json.Unmarshal之後的類型

一句話總結:所有JSON數值類型一律解析爲float64類型,需手動轉換;對於map類型需判斷是否爲nil再轉換爲所需類型。

interface{}類型在json.Unmarshal時,會自動將JSON轉換爲對應的數據類型:
JSON的boolean 轉換爲bool
JSON的數值 轉換爲float64
JSON的字符串 轉換爲string
JSON的Array 轉換爲[]interface{}
JSON的Object 轉換爲map[string]interface{},也可以轉爲本身類型
JSON的null 轉換爲nil

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Addr string `json:"addr,omitempty"`
}

func main() {
    var m map[string]interface{}     //聲明變量,不分配內存
    m = make(map[string]interface{}) //必可不少,分配內存
    m["name"] = "simon"
    var age int = 12
    m["age"] = age
    m["addr"] = "China"
    print_map(m)
    fmt.Println()

    data, _ := json.Marshal(m)

    m1 := make(map[string]interface{})
    _ = json.Unmarshal(data, &m1)
    print_map(m1)
    fmt.Println()

    if m1["name"] != nil {
        fmt.Println(m1["name"].(string))
    }
    if m1["type"] != nil {
        fmt.Println(m1["type"].(string))
    } else {
        fmt.Println("there is not the key of type")
    }
    fmt.Println()

    p := Person{"simon", 22, "China"}
    data, _ = json.Marshal(p)
    p1 := Person{}
    _ = json.Unmarshal(data, &m1)
    _ = json.Unmarshal(data, &p1)
    fmt.Println("map m1:", m1)
    fmt.Println("person:", p1)
    fmt.Println(m1["name"], m1["age"], m1["addr"])
    fmt.Println(p1.Name, p1.Age, p1.Addr)
}

運行結果

name is string simon
age is int 12
addr is string China

addr is string China
age is float64 12
name is string simon

simon
there is not the key of type

map m1: map[addr:China age:22 name:simon]
person: {simon 22 China}
simon 22 China
simon 22 China

Process finished with exit code 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章