json/xml
json
json可以和map、struct、interface相互转换
//将struct、map转换成json字符串json.Marshal(struct|map)//将json字符串转换成Person结构体typePersonstruct{...}jsonStr:=[]byte(`{"age":"18","name":"123.com","marry":false}`)varpPersonjson.Unmarshal(jsonStr,&p)
弱类型的js、php可以随时动态自由的转换json字符串,这个确实舒服太多,怪不得php开发者总说数组强大。
xml
与json包的方法是一样,只是数据源不一样
xml.Marshal(struct|map)xml.Unmarshal(xmlStr,&p)
msgpack
MSGPack是二进制的json,性能更快,更省空间
需要安装第三方包:go get -u github.com/vmihailenco/msgpack
msgpack.Marshal(struct|map)msgpack.Unmarshal(msgpackbinary,&p)
很多时候,我们可能遇到这样的场景,就是远端返回的JSON数据不是你想要的类型,或者你想做额外的操作,比如在解析的过程中进行校验,或者类型转换,那么我们可以这样或者在解析过程中进行数据转换
packagemainimport("bytes""encoding/json""fmt")//Mail_typeMailstruct{Valuestring}//UnmarshalJSON_func(m*Mail)UnmarshalJSON(data[]byte)error{//这里简单演示一下,简单判断即可ifbytes.Contains(data,[]byte("@")){returnfmt.Errorf("mailformaterror")}m.Value=string(data)returnnil}//UnmarshalJSON_func(m*Mail)MarshalJSON()(data[]byte,errerror){ifm!=nil{data=[]byte(m.Value)}return}//Phone_typePhonestruct{Valuestring}//UnmarshalJSON_func(p*Phone)UnmarshalJSON(data[]byte)error{//这里简单演示一下,简单判断即可iflen(data)!=11{returnfmt.Errorf("phoneformaterror")}p.Value=string(data)returnnil}//UnmarshalJSON_func(p*Phone)MarshalJSON()(data[]byte,errerror){ifp!=nil{data=[]byte(p.Value)}return}//UserRequest_typeUserRequeststruct{NamestringMailMailPhonePhone}funcmain(){user:=UserRequest{}user.Name="zhangsan"user.Mail.Value="zhangsan@x.com"user.Phone.Value="12345678"fmt.Println(json.Marshal(user))}