Go 工程化 - JSON 使用技巧
概述
在 Go 快速入门指南 - JSON 讲解了 JSON
的常用方法,但是除此之外,JSON
还有一些鲜为人知的使用技巧, 可以简洁地组合和忽略结构体字段,避免了重新定义结构体和内嵌结构体等较为笨拙的方式,这在 接口输出
和 第三发接口对接
业务场景中非常有帮助。
这篇做一个补充,两篇文章涉及到的 JSON
知识点,应该足够大部分开发场景的使用了。
例子
临时忽略某个字段
比如在接口中输出用户信息时,希望过滤掉 密码 字段。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
UserName string `json:"userName"`
Email string `json:"email"`
Password string `json:"password"`
}
func main() {
u := &User{
UserName: "root",
Email: "root@gmail.com",
Password: "123456",
}
data, err := json.Marshal(struct {
*User
// 使用一个内嵌的字段覆盖掉原字段
Password string `json:"password,omitempty"`
}{
User: u,
})
if err != nil {
panic(err)
}
fmt.Printf("%s\n", data)
}
// $ go run main.go
// 输出如下
/**
{"userName":"root","email":"root@gmail.com"}
*/
临时添加字段
比如在接口中输出用户信息时,希望添加一个 Token 字段。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
UserName string `json:"userName"`
Email string `json:"email"`
Password string `json:"password"`
}
func main() {
u := &User{
UserName: "root",
Email: "root@gmail.com",
Password: "123456",
}
data, err := json.Marshal(struct {
*User
// 使用一个内嵌的字段覆盖掉原字段
Password string `json:"password,omitempty"`
// 新增一个字段
Token string `json:"token"`
}{
User: u,
Token: "askdhfh2oyy43423#14$$asdssxxx11",
})
if err != nil {
panic(err)
}
fmt.Printf("%s\n", data)
}
// $ go run main.go
// 输出如下
/**
{"userName":"root","email":"root@gmail.com","token":"askdhfh2oyy43423#14$$asdssxxx11"}
*/
字符串和数字转换
接口对接时,可能会存在双方字段名称一样,但是类型不一样的的情况。比如同一个字段,A 方用 int
类型, B 方用 string
类型,下面的例子演示如何解决这个 数据类型冲突问题
。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
UserName string `json:"userName"`
Email string `json:"email"`
Password string `json:"password"`
// 字段是 int 类型, JSON 输出 string 类型
Age int `json:"age,string"`
}
func main() {
u := &User{
UserName: "root",
Email: "root@gmail.com",
Password: "123456",
Age: 100,
}
data, err := json.Marshal(u)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", data)
}
// $ go run main.go
// 输出如下
/**
{"userName":"root","email":"root@gmail.com","password":"123456","age":"
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2022-02-15 免费好用的MySQL高可用方案
2022-02-15 git 查看分支、切换分支及合并分支 命令
2022-02-15 jenkins插件git获得过程