golang常用库-常用json/xml操作

751 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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))
}