Golang json用法詳解(二)


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

}

```


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM