Golang json用法詳解(二)
簡介
這下講一講Golang如何自定義解析JSON,Golang自帶的JSON解析功能非常強悍
說明
很多時候,我們可能遇到這樣的場景,就是遠端返回的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 = "ysy"
user.Mail.Value = "yangshiyu@x.com"
user.Phone.Value = "18900001111"
fmt.Println(json.Marshal(user))
}
```
為什么要這樣?
如果是客戶端開發,需要開發大量的API,接收大量的JSON,在開發早期定義各種類型看起來是很大的工作量,不如寫 if else 判斷數據簡單暴力。但是到開發末期,你會發現預先定義的方式能極大的提高你的代碼質量,減少代碼量。下面實例1和實例2,誰能減少代碼一目了然
```
實例1,if else做數據校驗
// UserRequest _
type UserRequest struct {
Name string
Mail string
Phone string
}
func AddUser(data []byte) (err error) {
user := &UserRequest{}
err = json.Unmarshal(data, user)
if err != nil {
return
}
//
if isMail(user.Mail) {
return fmt.Errorf("mail format error")
}
if isPhone(user.Phone) {
return fmt.Errorf("phone format error")
}
// TODO
return
}
實例2,利用預先定義好的類型,在解析時就進行判斷
// UserRequest _
type UserRequest struct {
Name string
Mail Mail
Phone Phone
}
func AddUser(data []byte) {
user := &UserRequest{}
err = json.Unmarshal(data, user)
if err != nil {
return
}
// TODO
}
```