一句話總結:所有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