Go語言中的JSON序列化和反序列化是非常常用的操作,通常情況下,我們只需要使用Go自帶的序列化和反序列化工具即可滿足我們的需求。但是,如果我們需要對JSON數據進行一些特殊的處理,或者需要自定義JSON的輸出格式,那么就需要使用自定義序列化來實現了。
Go語言中的自定義序列化非常簡單,我們只需要在結構體中定義MarshalJSON和UnmarshalJSON這兩個方法即可。其中,MarshalJSON方法用于將Go對象序列化成JSON字符串,UnmarshalJSON方法則用于將JSON字符串反序列化成Go對象。
type Person struct { Name string Age int } func (p Person) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf("{ \"name\": \"%s\", \"age\": %d }", p.Name, p.Age)), nil } func (p *Person) UnmarshalJSON(data []byte) error { var m map[string]interface{} if err := json.Unmarshal(data, &m); err != nil { return err } name, ok := m["name"].(string) if !ok { return errors.New("missing or invalid name field") } p.Name = name age, ok := m["age"].(float64) if !ok { return errors.New("missing or invalid age field") } p.Age = int(age) return nil }
上面的代碼中,我們定義了一個Person結構體,并在結構體中實現了MarshalJSON和UnmarshalJSON方法。在MarshalJSON方法中,我們將Person結構體序列化成一個JSON對象,然后將其以字節數組的形式返回。在UnmarshalJSON方法中,我們首先將JSON字符串反序列化成一個map類型的對象,然后根據map中的字段值來初始化Person結構體的屬性。如果反序列化過程中發現某些字段不存在或者格式不正確,我們就返回一個錯誤。
使用自定義序列化的好處是我們可以將JSON的輸出格式與我們的業務邏輯分離開來,從而提高代碼的可維護性和可重用性。此外,自定義序列化還可以用于對JSON數據進行加密、壓縮或者其他特殊處理。