JSON是一種輕量級的數據交換格式,常用于前后端通訊和數據存儲。在golang中,內置了對JSON的支持,包括序列化和反序列化。
將golang的結構體序列化為JSON格式的數據,可以使用標準庫中的json.Marshal函數:
type User struct { Name string Age int } func main() { user := User{"Tom", 20} data, _ := json.Marshal(user) fmt.Println(string(data)) // {"Name":"Tom", "Age":20} }
json.Unmarshal函數可將JSON格式的數據反序列化為golang的結構體:
type User struct { Name string Age int } func main() { jsonString := `{"Name":"Tom", "Age":20}` var user User json.Unmarshal([]byte(jsonString), &user) fmt.Println(user.Name, user.Age) // Tom 20 }
使用標簽tag可以對結構體字段進行額外的描述,包括json格式化時的字段名和空值處理等:
type User struct { Name string `json:"name,omitempty"` Age int `json:"age,omitempty"` } func main() { user := User{"Tom", 20} data, _ := json.Marshal(user) fmt.Println(string(data)) // {"name":"Tom", "age":20} }
在處理復雜的JSON數據時,可以使用map[string]interface{}或[]interface{}類型來表示JSON對象或數組:
func main() { jsonString := `{ "name": "Tom", "age": 20, "hobbies": ["reading", "music"], "address": { "city": "Shanghai", "street": "xx road" } }` var data map[string]interface{} json.Unmarshal([]byte(jsonString), &data) fmt.Println(data["name"].(string)) // Tom fmt.Println(data["hobbies"].([]interface{})) // [reading music] fmt.Println(data["address"].(map[string]interface{})["city"].(string)) // Shanghai }
需要注意的是,使用map[string]interface{}或[]interface{}類型進行JSON解析時,需要進行類型斷言,否則會引發panic。
總之,golang對JSON的支持十分強大和靈活,可滿足大部分的需求,同時也需要注意字段的標簽和類型斷言等。
上一篇mysql包含所有條件
下一篇mysql動態觸發器表名