3.3 json 处理

需要引入”encoding/json”包

json解析到map

  1. jsonStr := "{\"a\":\"test\",\"b\":\"testb\"}"
  2. var dat map[string]string
  3. err := json.Unmarshal([]byte(jsonStr), &dat)
  4. if err == nil {
  5. fmt.Println(dat)
  6. }
  7. 结果:
  8. map[a:test b:testb]

json解析到数组

  1. jsonStr := "[\"test\",\"testb\"]"
  2. var dat []string
  3. err := json.Unmarshal([]byte(jsonStr), &dat)
  4. if err == nil {
  5. fmt.Println(dat)
  6. }

json 解析到结构体

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type Person struct {
  7. //结构也是一种类型
  8. Name string //定义struct的属性
  9. Age int
  10. }
  11. func main() {
  12. var person Person
  13. jsonStr := "{\"Name\":\"test\",\"Age\":19}"
  14. if err := json.Unmarshal([]byte(jsonStr), &person); err == nil {
  15. fmt.Println(person)
  16. }
  17. }
  18. 结果:
  19. {test 19}

interface{}

如果不想用结构体,怎么办,如api接收过来的参数,不确定json串里面有什么数据类型,可通过interface{}实现

示例:

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. func main() {
  7. var data map[string]interface{}
  8. jsonStr := "{\"Name\":\"test\",\"Age\":19,\"infos\":[{\"info1\":\"hello\"},{\"info2\":\"hello\"}],\"pic\":{\"pic1\":\"img.jpg\"}}"
  9. err := json.Unmarshal([]byte(jsonStr), &data)
  10. if err != nil {
  11. fmt.Println(err)
  12. }
  13. fmt.Println(data)
  14. for _,value:=range data{
  15. switch value.(type) {
  16. case float64:
  17. fmt.Println(value)
  18. case string:
  19. fmt.Println(value)
  20. case []interface {}:
  21. for k,v:=range value.([]interface {}){
  22. fmt.Println(k,v)
  23. }
  24. case map[string]interface {}:
  25. for k,v:=range value.(map[string]interface {}){
  26. fmt.Println(k,v)
  27. }
  28. }
  29. }
  30. }
  31. 输出结果:
  32. map[infos:map[info:hello] Name:test Age:19]

将数组或结构体转成json

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. func main() {
  7. arr := []string{"aaa", "bbb", "ccc"}
  8. data, err := json.Marshal(arr)
  9. if err == nil {
  10. //data是[]byte类型,转化成string类型便于查看
  11. fmt.Println(string(data))
  12. }
  13. }

小结:

1、用interface{}需要注意, JSON 里的数字默认都会转成 Golang 的 float64 类型,字符是string,使用方式为

  1. fmt.Println(data["Name"].(string))
  2. fmt.Println(data["Age"].(float64))

float64转其他类型,可参考:类型转换

2、golang 里json不是字符串而是 []byte类型,如果想用字符串可以用string()转。

links