为什么要序列化和反序列化

  我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等, Go 语言当然也支持所有这些编码格式。

序列化与反序列化定义

  序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。通过从存储区中读取对象的状态,重新创建该对象,则为反序列化

 

序列化和反序列化规则

Go类型              json 类型

bool                   booleans

float64               numbers

string                 strings

nil                      null

在解析 json 格式数据时,若以 interface{} 接收数据,需要按照以上规则进行解析。

 

代码演示

反序列化

package main

import (
   "encoding/json"
   "fmt"
)

type People struct {
   name   string  `json:"name"` // name,小写不导出
   Age    int     `json:"age"`  // age
   Gender string `json:"gender"`  // gender
   Lesson
}

type Lesson struct {
   Lessons []string `json:"lessons"`
}

func main() {
   jsonstr := `{"Age": 18,"name": "Jim" ,"gender": "","lessons":["English","History"],"Room":201,"n":null,"b":false}`

   // 反序列化
   var people People
   if err := json.Unmarshal([]byte(jsonstr),&people); err == nil {
      fmt.Println("struct people:")
      fmt.Println(people)
   }

   // 反序列化 json 字符串中的一部分
   var lessons Lesson
   if err := json.Unmarshal([]byte(jsonstr),&lessons); err == nil {
      fmt.Println("struct lesson:")
      fmt.Println(lessons)
   }

   // 反序列化 json 字符串数组
   jsonstr = `["English","History"]`
   var str []string
   if err := json.Unmarshal([]byte(jsonstr), &str); err == nil {
      fmt.Println("struct str:")
      fmt.Println(str)
   }
}

// 打印结果
  struct people:
  { 18 男 {[English History]}}
  struct lesson:
  {[English History]}
  struct str:
  [English History]
反序列化

相关文章: