小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
json/xml
json
json可以和map、struct、interface相互转换
// 将struct、map转换成json 字符串
json.Marshal(struct|map)
//将json字符串转换成Person结构体
type Person struct{
...
}
jsonStr := []byte(`{"age":"18","name":"123.com","marry":false}`)
var p Person
json.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数据不是你想要的类型,或者你想做额外的操作,比如在解析的过程中进行校验,或者类型转换,那么我们可以这样或者在解析过程中进行数据转换
package main
import (
"bytes"
"encoding/json"
"fmt"
)
// Mail _
type Mail struct {
Value string
}
// UnmarshalJSON _
func (m *Mail) UnmarshalJSON(data []byte) error {
// 这里简单演示一下,简单判断即可
if bytes.Contains(data, []byte("@")) {
return fmt.Errorf("mail format error")
}
m.Value = string(data)
return nil
}
// UnmarshalJSON _
func (m *Mail) MarshalJSON() (data []byte, err error) {
if m != nil {
data = []byte(m.Value)
}
return
}
// Phone _
type Phone struct {
Value string
}
// UnmarshalJSON _
func (p *Phone) UnmarshalJSON(data []byte) error {
// 这里简单演示一下,简单判断即可
if len(data) != 11 {
return fmt.Errorf("phone format error")
}
p.Value = string(data)
return nil
}
// UnmarshalJSON _
func (p *Phone) MarshalJSON() (data []byte, err error) {
if p != nil {
data = []byte(p.Value)
}
return
}
// UserRequest _
type UserRequest struct {
Name string
Mail Mail
Phone Phone
}
func main() {
user := UserRequest{}
user.Name = "zhangsan"
user.Mail.Value = "zhangsan@x.com"
user.Phone.Value = "12345678"
fmt.Println(json.Marshal(user))
}