简介

Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该

字符串解析成相应的数据结构,如string类型,strcut对象等。

go语言本身为我们提供了json的工具包<font style="background-color:#FADB14;">encoding/json</font> ## Json Marshal > 将数据编码成json字符串 > go func Marshal(v interface{}) ([]byte, error) :::warning 注意,返回的是byte数组 ::: 看一个简单的例子
  1. type Stu struct {
  2. Name string `json:"name"`
  3. Age int
  4. HIgh bool
  5. sex string
  6. Class *Class `json:"class"`
  7. }
  8. type Class struct {
  9. Name string
  10. Grade int
  11. }
  12. func main() {
  13. //实例化一个数据结构,用于生成json字符串
  14. stu := Stu{
  15. Name: "张三",
  16. Age: 18,
  17. HIgh: true,
  18. sex: "男",
  19. }
  20. //指针变量
  21. cla := new(Class)
  22. cla.Name = "1班"
  23. cla.Grade = 3
  24. stu.Class=cla
  25. //Marshal失败时err!=nil
  26. jsonStu, err := json.Marshal(stu)
  27. if err != nil {
  28. fmt.Println("生成json字符串错误")
  29. }
  30. //jsonStu是[]byte类型,转化成string类型便于查看
  31. fmt.Println(string(jsonStu))
  32. }
结果:
  1. {
  2. "name": "张三",
  3. "Age": 18,
  4. "HIgh": true,
  5. "class": {
  6. "Name": "1班",
  7. "Grade": 3
  8. }
  9. }

从结果中可以看出:

  • 只要是可导出成员(变量首字母大写),都可以转成json。因成员变量sex是不可导出的,故无法转成json。
  • 如果变量打上了json标签,如Name旁边的 json:”name” ,那么转化成的json key就用该标签“name”,否则取变量名作为key,如“Age”,“HIgh”。
  • bool类型也是可以直接转换为json的value值。Channel, complex 以及函数不能被编码json字符串。
  • 指针变量,编码时自动转换为它所指向的值,如cla变量。
    (当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)

Json Unmarshal

将json字符串解码到相应的数据结构

:::warning (The argument to Unmarshal must be a non-nil pointer.)

:::

  1. func Unmarshal(data []byte, v interface{}) error

看一个简单的例子

  1. type StuRead struct {
  2. Name interface{} `json:"name"`
  3. Age interface{}
  4. HIgh interface{}
  5. sex interface{}
  6. Class interface{} `json:"class"`
  7. Test interface{}
  8. }
  9. type Class struct {
  10. Name string
  11. Grade int
  12. }
  13. func main() {
  14. //json字符中的"引号,需用\进行转义,否则编译出错
  15. //json字符串沿用上面的结果,但对key进行了大小的修改,并添加了sex数据
  16. data:="{\"name\":\"张三\",\"Age\":18,\"high\":true,\"sex\":\"男\",\"CLASS\":{\"naME\":\"1班\",\"GradE\":3}}"
  17. str:=[]byte(data)
  18. //1.Unmarshal的第一个参数是json字符串对应的byte数组,第二个参数是接受json解析的数据结构。
  19. //第二个参数必须是指针,否则无法接收解析的数据,如stu仍为空对象StuRead{}
  20. //2.可以直接stu:=new(StuRead),此时的stu自身就是指针
  21. stu:=StuRead{}
  22. err:=json.Unmarshal(str,&stu)
  23. //解析失败会报错,如json字符串格式不对,缺"号,缺}等。
  24. if err!=nil{
  25. fmt.Println(err)
  26. }
  27. fmt.Println(stu)
  28. }

结果

  1. {张三 18 true <nil> map[naME:1 GradE:3] <nil>}