概述

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 key-value
JSON是2001年开始推广使用的数据格式,目前以及成为主流的数据格式。
JSON易于机器解析和生成,并有效的提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成JSON字符串,接收方得到JSON字符串时,再反序列化恢复成原来的数据类型(结构体、map等)

image.png

JSON序列化

import “encoding/json”

json包实现了json对象的编解码,参见RFC 4627。Json对象和go类型的映射关系请参见Marshal和Unmarshal函数的文档。
参见”JSON and Go”获取本包的一个介绍:http://golang.org/doc/articles/json_and_go.html
func Marshal(v interface{}) ([]byte, error)
Marshal函数返回v的json编码。

主要对struct、map、slice的序列化,转化成JSON字符串的形式。
基本数据类型序列化意义不大

代码

  1. // json 序列化
  2. package main
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7. // 这就需要通过 tag 来转化大写的字段,同时又保证内部调用的时候可以暴露变量
  8. // 反射原理
  9. type People struct {
  10. Name string `json:"name01"`
  11. Age int `json:"age"`
  12. Height float64 `json:"height"`
  13. }
  14. func testStruct() {
  15. p1 := People{
  16. Name: "tom",
  17. Age: 18,
  18. Height: 178.5,
  19. }
  20. data, err := json.Marshal(p1)
  21. if err != nil {
  22. fmt.Println("序列化失败", err)
  23. } else {
  24. fmt.Println("data = ", string(data)) // {"name01":"tom","age":18,"height":178.5}
  25. }
  26. }
  27. func testMap() {
  28. var dict map[string]interface{} = make(map[string]interface{})
  29. dict["海贼王"] = "luffy"
  30. dict["剑豪"] = "索隆"
  31. fmt.Printf("dict类型: %T, 值:%v \n", dict, dict)
  32. data, err := json.Marshal(dict)
  33. if err != nil {
  34. fmt.Println("序列化失败", err)
  35. } else {
  36. fmt.Println("data = ", string(data)) // {"剑豪":"索隆","海贼王":"luffy"}
  37. }
  38. }
  39. func testSlice() {
  40. var slice []map[string]interface{}
  41. var m1 map[string]interface{} = make(map[string]interface{})
  42. m1["name"] = "xixi"
  43. m1["age"] = 7
  44. var m2 map[string]interface{} = make(map[string]interface{})
  45. m2["name"] = "haha"
  46. m2["age"] = 8
  47. m2["addr"] = [2]string{"北京", "上海"}
  48. slice = append(slice, m1, m2)
  49. data, err := json.Marshal(slice)
  50. if err != nil {
  51. fmt.Println("序列化失败", err)
  52. } else {
  53. fmt.Println("data = ", string(data)) // [{"age":7,"name":"xixi"},{"addr":["北京","上海"],"age":8,"name":"haha"}]
  54. }
  55. }
  56. func testFloat64() {
  57. var n1 float64 = 12.21
  58. data, err := json.Marshal(n1)
  59. if err != nil {
  60. fmt.Println("序列化失败", err)
  61. } else {
  62. fmt.Println("data = ", string(data)) // 12.21
  63. }
  64. }
  65. func main() {
  66. // struct
  67. testStruct()
  68. // map
  69. testMap()
  70. // slice
  71. testSlice()
  72. // 基本数据类型序列化
  73. // 对基本数据类型序列化 意义不大
  74. testFloat64()
  75. }

JSON反序列化

import “encoding/json”

func Unmarshal(data []byte, v interface{}) error
Unmarshal函数解析json编码的数据并将结果存入v指向的值。
Unmarshal和Marshal做相反的操作,必要时申请映射、切片或指针,

注意

在反序列化一个json字符串时,要确保反序列化后的数据类型和序列化前的数据类型一致

代码

  1. // json 反序列化
  2. package main
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7. type People struct {
  8. Name string `json:"name01"`
  9. Age int `json:"age"`
  10. Height float64 `json:"height"`
  11. }
  12. func unMarshalStruct() {
  13. var jsonStr string = "{\"name01\":\"tom\",\"age\":18,\"height\":178.5}"
  14. var p1 People
  15. // 要传入 &p1 指针类型,要写入的变量实例(可修改)
  16. // 用 &p1 接收反序列化后的结果
  17. err := json.Unmarshal([]byte(jsonStr), &p1)
  18. if err != nil {
  19. fmt.Println("反序列化失败", err)
  20. } else {
  21. fmt.Println("p1 = ", p1) // {tom 18 178.5}
  22. }
  23. }
  24. // 测试序列化和反序列化
  25. func testMap() string {
  26. var dict map[string]interface{} = make(map[string]interface{})
  27. dict["海贼王"] = "luffy"
  28. dict["剑豪"] = "索隆"
  29. fmt.Printf("dict类型: %T, 值:%v \n", dict, dict)
  30. data, err := json.Marshal(dict)
  31. if err != nil {
  32. fmt.Println("序列化失败", err)
  33. } else {
  34. fmt.Println("data = ", string(data)) // {"剑豪":"索隆","海贼王":"luffy"}
  35. }
  36. return string(data)
  37. }
  38. func unMarshalMap() {
  39. // var jsonStr string = "{\"剑豪\":\"索隆\",\"海贼王\":\"luffy\"}"
  40. var jsonStr string = testMap()
  41. var dict map[string]interface{}
  42. // 注意: 反序列化map不需要 make 操作
  43. // make 操作被封装到 json.Unmarshal() 里面
  44. err := json.Unmarshal([]byte(jsonStr), &dict)
  45. if err != nil {
  46. fmt.Println("反序列化失败", err)
  47. } else {
  48. fmt.Println("dict = ", dict) // map[剑豪:索隆 海贼王:luffy]
  49. }
  50. }
  51. func unMarshalSlice() {
  52. var jsonStr = "[{\"age\":7,\"name\":\"xixi\"}," +
  53. "{\"addr\":[\"北京\",\"上海\"],\"age\":8,\"name\":\"haha\"}]"
  54. var slice []map[string]interface{}
  55. // 同样不需要 make
  56. err := json.Unmarshal([]byte(jsonStr), &slice)
  57. if err != nil {
  58. fmt.Println("反序列化失败", err)
  59. } else {
  60. fmt.Println("slice = ", slice) // [map[age:7 name:xixi] map[addr:[北京 上海] age:8 name:haha]]
  61. }
  62. }
  63. func main() {
  64. unMarshalStruct()
  65. unMarshalMap()
  66. unMarshalSlice()
  67. }