package main
import (
"encoding/json"
"fmt"
)
type Book struct {
Title string
Authors []string
Publisher string
IsPublished bool
Price float64
}
func main() {
var book Book
b := `{"Title":"Go语言编程","Authors":["ZhangSan","LiSi"],"Publisher":"ituring.com.cn","IsPublished":true,"Price":9.99}`
err := json.Unmarshal([]byte(b), &book)
if err != nil {
fmt.Println(err)
}
fmt.Println(book) //{Go语言编程 [ZhangSan LiSi] ituring.com.cn true 9.99}
fmt.Println(book.Title) //Go语言编程
fmt.Println(book.Publisher) //ituring.com.cn
var mp map[string]string
m := `{"lisi":"李四","wangwu":"王五","zhangsan":"张三"}`
json.Unmarshal([]byte(m), &mp)
fmt.Println(mp) //map[zhangsan:张三 lisi:李四 wangwu:王五]
fmt.Println(mp["lisi"]) //李四
fmt.Println(mp["zhangsan"]) //张三
}
3、解码未知结构的JSON数据
没有任何方法的空接口可以代表任何类型。换句话说,每一个类型其实都至少实现了一个空接口。
Go内建这样灵活的类型系统,向我们传达了一个很有价值的信息:空接口是通用类型。
如果要解码一段未知结构的JSON,只需将这段JSON数据解码输出到一个空接口即可。
package main
import (
"encoding/json"
"fmt"
)
type Book struct {
Title string
Authors []string
Publisher string
IsPublished bool
price float64
}
func main() {
var r interface{}
b := []byte(`{"Title":"Go语言编程","Authors":["ZhangSan","LiSi"],"Publisher":"ituring.com.cn","IsPublished":true,"Price":9.99}`)
err := json.Unmarshal(b, &r) //最终r将会是一个键值对的 map[string]interface{} 结构
if err != nil {
fmt.Println(err)
}
gobook, ok := r.(map[string]interface{})
if ok {
for k, v := range gobook {
switch v2 := v.(type) {
case string:
fmt.Println(k, "is string", v2)
case int:
fmt.Println(k, "is int", v2)
case bool:
fmt.Println(k, "is bool", v2)
case []interface{}:
fmt.Println(k, "is an array:")
for i, iv := range v2 {
fmt.Println(i, iv)
}
default:
fmt.Println(k, "is another type not handle yet")
}
}
}
}