Maison > Article > développement back-end > Introduction à la sérialisation et à la désérialisation Golang
Ce qui suit est une introduction à la sérialisation et à la désérialisation Golang de la colonne tutoriel Golang J'espère que cela sera utile aux amis dans le besoin !
Nos objets de données doivent être codés et décodés s'ils doivent être transmis sur le réseau ou enregistrés sur d'un fichier Actions, il existe actuellement de nombreux formats d'encodage : json, XML, Gob, Google Protocol Buffer, etc. Bien entendu, le langage Go supporte également tous ces formats d'encodage.
La sérialisation (sérialisation) est le processus de conversion des informations d'état d'un objet sous une forme qui peut être stockée ou transmise. Lors de la sérialisation, un objet écrit son état actuel dans un stockage temporaire ou persistant. En lisant l'état de l'objet depuis la zone de stockage et en recréant l'objet, la désérialisation
Go type json type
bool booleans
nombres float64
chaînes de caractères
nil null
Lors de l'analyse des données au format json, si vous utilisez l'interface{} pour recevoir des données, vous devez suivre les règles ci-dessus sont analysé.
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]
Désérialisation
package main import ( "encoding/json" "fmt") type People struct { name string `json:"name"` // name,小写不导出 Age int `json:"age"` // age,在 json 字符串中叫 age Gender string `json:"gender"` // gender Lesson } type Lesson struct { Lessons []string `json:"lessons"` } func main() { lesson := Lesson{[]string{"Math","English","Chinese"}} people := &People{ name: "amy", Age: 22, Gender: "female", Lesson: lesson, } if b, err := json.Marshal(people); err != nil { fmt.Println("Marshal failed...") }else { fmt.Println(b) fmt.Println(string(b)) } } // 打印结果 [123 34 97 103 101 34 58 50 50 44 34 103 101 110 100 101 114 34 58 34 102 101 109 97 108 101 34 44 34 108 101 115 115 111 110 115 34 58 91 34 77 97 116 104 34 44 34 69 110 103 108 105 115 104 34 44 34 67 104 105 110 101 115 101 34 93 125] {"age":22,"gender":"female","lessons["Math","English","Chinese“}
Sérialisation
package main import ( "fmt" "encoding/json") type Student struct { Name string Age int Guake bool Classes []string Price float32 } func (s * Student)ShowStu() { fmt.Println("show Student :") fmt.Println("\tName\t:", s.Name) fmt.Println("\tAge\t:", s.Age) fmt.Println("\tGuake\t:", s.Guake) fmt.Println("\tPrice\t:", s.Price) fmt.Printf("\tClasses\t: ") for _, a := range s.Classes { fmt.Printf("%s ", a) } fmt.Println("") } func main() { st := &Student { "Xiao Ming", 16, true, []string{"Math", "English", "Chinese"}, 9.99, } fmt.Println("before JSON encoding :") st.ShowStu() b, err := json.Marshal(st) if err != nil { fmt.Println("encoding faild") } else { fmt.Println("encoded data : ") fmt.Println(b) fmt.Println(string(b)) } ch := make(chan string, 1) go func(c chan string, str string){ c <- str }(ch, string(b)) strData := <-ch fmt.Println("--------------------------------") stb := &Student{} stb.ShowStu() err = json.Unmarshal([]byte(strData), &stb) if err != nil { fmt.Println("Unmarshal faild") } else { fmt.Println("Unmarshal success") stb.ShowStu() } }
Exemple
Le package json fournit des types de décodeur et d'encodeur pour prendre en charge la lecture et l'écriture de flux de données JSON courants. Les fonctions NewDecoder et NewEncoder encapsulent respectivement les interfaces io.Reader et io.Writer.
package main import ( "encoding/json" "fmt" "os" "strings") type People struct { name string `json:"name"` // name,小写不导出 Age int `json:"age"` // age,在 json 字符串中叫 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}` strR := strings.NewReader(jsonStr) people := &People{} // 用 NewDecoder && Decode 进行解码给定义好的结构体对象 people err := json.NewDecoder(strR).Decode(people) if err != nil { fmt.Println(err) } fmt.Printf("%+v",people) // // 用 NewEncoder && Encode 把保存的 people 结构体对象编码为 json 保存到文件 f, err := os.Create("./people.json") json.NewEncoder(f).Encode(people) }
Exemple
package main import ( "encoding/json" "fmt" "os" "strings" ) type People struct { name string `json:"name"` // name,小写不导出 Age int `json:"age"` // age,在 json 字符串中叫 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}` strR := strings.NewReader(jsonStr) people := &People{} // 用 NewDecoder && Decode 进行解码给定义好的结构体对象 people err := json.NewDecoder(strR).Decode(people) if err != nil { fmt.Println(err) } fmt.Printf("%+v",people) // // 用 NewEncoder && Encode 把保存的 people 结构体对象编码为 json 保存到文件 f, err := os.Create("./people.json") json.NewEncoder(f).Encode(people) } 示例
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!