Golang 和 Json | 青训营笔记

89 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第1天。

第一课主要是讲解一些基本的 Golang 语法。
感觉没啥好写的啊...
这个青豆是真的蛋疼。

今天学习了一下 Golang 中对于 Json 的处理。
Golang 的 encoding/json 包支持了一系列的编码解码操作。
使用结构体定义一个对象,其中变量名需要使用大写字母开头。
如果需要给序列化后的 json 字段起别名,可以在成员变量后加上一个 json:"newName" 的 tag。
使用 json.Marshaljson.Unmarshal 来对 go 结构体进行序列化和反序列化。 我们可以看到 json 字节流和 ascii 码表示的 json 对象是一一对应的编码关系。

下面是这些对象的一个比较。

go 结构体对象
a := userInfo{
   Name: "wang",
   Age:  18,
   Hobby: []string{
      "Golang",
      "TypeScript",
   }}
格式化后的 json 对象
{
        "Name": "wang",
        "age": 18,
        "Hobby": [
                "Golang",
                "TypeScript"
        ]
}
json 字节流
[123 34 78 97 109 101 34 58 34 119 97 110 103 34 44 34 97 103 101 34 58 49 56 44 34 72 111 98 98 121 34 58 91 34 71 111 108 97 110 103 34 44 34 84 121 112 101 83 99 114 105 112 116 34 93 125]
json 对象
{"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}
编码对比
encoding = 123, character = {
encoding =  34, character = "
encoding =  78, character = N
encoding =  97, character = a
encoding = 109, character = m
encoding = 101, character = e
encoding =  34, character = "
encoding =  58, character = :
encoding =  34, character = "
encoding = 119, character = w
encoding =  97, character = a
encoding = 110, character = n
encoding = 103, character = g
encoding =  34, character = "
encoding =  44, character = ,
encoding =  34, character = "
encoding =  97, character = a
encoding = 103, character = g
encoding = 101, character = e
encoding =  34, character = "
encoding =  58, character = :
encoding =  49, character = 1
encoding =  56, character = 8
encoding =  44, character = ,
encoding =  34, character = "
encoding =  72, character = H
encoding = 111, character = o
encoding =  98, character = b
encoding =  98, character = b
encoding = 121, character = y
encoding =  34, character = "
encoding =  58, character = :
encoding =  91, character = [
encoding =  34, character = "
encoding =  71, character = G
encoding = 111, character = o
encoding = 108, character = l
encoding =  97, character = a
encoding = 110, character = n
encoding = 103, character = g
encoding =  34, character = "
encoding =  44, character = ,
encoding =  34, character = "
encoding =  84, character = T
encoding = 121, character = y
encoding = 112, character = p
encoding = 101, character = e
encoding =  83, character = S
encoding =  99, character = c
encoding = 114, character = r
encoding = 105, character = i
encoding = 112, character = p
encoding = 116, character = t
encoding =  34, character = "
encoding =  93, character = ]
encoding = 125, character = }
示例代码
package main

import (
   "encoding/json"
   "fmt"
)

type userInfo struct {
   Name  string
   Age   int `json:"age"`
   Hobby []string
}

func main() {
   // a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}\
   a := userInfo{
   Name: "wang",
   Age:  18,
   Hobby: []string{
      "Golang",
      "TypeScript",
   }}
   
   buf, err := json.Marshal(a)
   if err != nil {
      panic(err)
   }
   fmt.Println("Json 字节流:", buf)        // [123 34 78 97...]
   fmt.Println("字节流反序列化:", string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}

   for i := 0; i < len(buf); i++ {
      fmt.Printf("encoding = %3v, character = %v\n", buf[i], string(buf[i]))
   }

   buf, err = json.MarshalIndent(a, "", "\t")
   if err != nil {
      panic(err)
   }
   fmt.Println(string(buf))

   var b userInfo
   err = json.Unmarshal(buf, &b)
   if err != nil {
      panic(err)
   }
   fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
}