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