Golang中结构体与json格式字符串可通过系统库
encoding/json完成
-
struct转json字符串
通过
json.Marshal将结构体转换为字符串输出。package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int From string } func main() { p := Person{} p.Name = "xiaoming" p.Age = 18 p.From = "china" v, err := json.Marshal(p) if err != nil { fmt.Println("marshal failed!", err) return } fmt.Println("marsha result: ", string(v)) return }执行后输出:
marsha result: {“Name”:“xiaoming”,“Age”:18,“From”:“china”}
不能转换结构体中未导出变量
package main import ( "encoding/json" "fmt" ) type Person struct { Name string age int From string } func main() { p := Person{} p.Name = "xiaoming" p.age = 18 p.From = "china" v, err := json.Marshal(p) if err != nil { fmt.Println("marshal failed!", err) return } fmt.Println("marsha result: ", string(v)) return }执行后输出:
marsha result: {“Name”:“xiaoming”,“From”:“china”}
导出json字符串中key名字与结构体变量命名一致,我们可以通过结构体定义时指定导出后key值;并且支持如果结构体中变量为空时不导出。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"person_name"` Age int `json:"person_age"` From string `json:"person_from,omitempty"` } func main() { p := Person{} p.Name = "xiaoming" p.Age = 18 v, err := json.Marshal(p) if err != nil { fmt.Println("marshal failed!", err) return } fmt.Println("marsha result: ", string(v)) p.From = "china" v, err = json.Marshal(p) if err != nil { fmt.Println("marshal failed!", err) return } fmt.Println("marsha result: ", string(v)) return }执行后输出:
marsha result: {“person_name”:“xiaoming”,“person_age”:18}
marsha result: {“person_name”:“xiaoming”,“person_age”:18,“person_from”:“china”} -
json字符串转struct
通过
json.Unmarshal将json格式字符串转换成structpackage main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"person_name"` Age int `json:"person_age"` From string `json:"person_from,omitempty"` } func main() { p := Person{} data := `{"person_name":"xiaoming","person_age":18}` err := json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("unmarshal failed!") return } fmt.Println("unmarshal result:", p) data = `{"person_name":"xiaoming","person_age":18,"person_from":"china"}` err = json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("unmarshal failed!") return } fmt.Println("unmarshal result:", p) return }执行后输出:
unmarshal result: {xiaoming 18 }
unmarshal result: {xiaoming 18 china}如果struct定义是未指定json对应key值,则默认使用struct中变量名作为key值,并且不区分json字符串中key值大小写。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int From string } func main() { p := Person{} data := `{"Name":"xiaoming","Age":18}` err := json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("unmarshal failed!") return } fmt.Println("unmarshal result:", p) data = `{"naMe":"xiaoming","AGE":18,"from":"china"}` err = json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("unmarshal failed!") return } fmt.Println("unmarshal result:", p) return }执行后输出:
unmarshal result: {xiaoming 18 }
unmarshal result: {xiaoming 18 china}
本文介绍了Golang中如何将结构体转换为JSON字符串,以及如何将JSON字符串反序列化为结构体。在转换过程中,讨论了导出变量的重要性、自定义JSON键名以及空值处理。同时,展示了不同情况下的转换示例及其输出结果。
953

被折叠的 条评论
为什么被折叠?



