Go 中 JSON解析时数据处理

如何去处理?

很多时候,我们可能遇到这样的场景,就是远端返回的JSON数据不是你想要的类型,或者你想做额外的操作,比如在解析的过程中进行校验,或者类型转换,那么我们可以这样或者在解析过程中进行数据转换


package main

import (
    "bytes"
    "encoding/json"
    "fmt"
)

type Mail struct {
    Value string
}

func (m *Mail) UnmarshalJSON(data []byte) error {
    // 这里简单演示一下,简单判断即可
    if bytes.Contains(data, []byte("@")) {
        return fmt.Errorf("mail format error")
    }
    m.Value = string(data)
    return nil
}

func (m *Mail) MarshalJSON() (data []byte, err error) {
    if m != nil {
        data = []byte(m.Value)
    }
    return
}

type Phone struct {
    Value string
}

func (p *Phone) UnmarshalJSON(data []byte) error {
    // 这里简单演示一下,简单判断即可
    if len(data) != 11 {
        return fmt.Errorf("phone format error")
    }
    p.Value = string(data)
    return nil
}

func (p *Phone) MarshalJSON() (data []byte, err error) {
    if p != nil {
        data = []byte(p.Value)
    }
    return
}

type UserRequest struct {
    Name  string
    Mail  Mail
    Phone Phone
}

func main() {
    user := UserRequest{}
    user.Name = "ysy"
    user.Mail.Value = "[email protected]"
    user.Phone.Value = "18900001111"
    fmt.Println(json.Marshal(user))
}

为什么这样做?

如果是客户端开发,需要开发大量的API,接收大量的JSON,在开发早期定义各种类型看起来是很大的工作量,不如写 if else 判断数据简单暴力。但是到开发末期,你会发现预先定义的方式能极大的提高你的代码质量,减少代码量。下面实例1和实例2,谁能减少代码一目了然

//实例1if else做数据校验
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,利用预先定义好的类型,在解析时就进行判断
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

}

猜你喜欢

转载自blog.csdn.net/Smicry/article/details/80706381