0

0

Go语言encoding/json包:优雅实现JSON键名小写转换

碧海醫心

碧海醫心

发布时间:2025-09-13 11:32:30

|

746人浏览过

|

来源于php中文网

原创

Go语言encoding/json包:优雅实现JSON键名小写转换

在Go语言中,结构体导出字段通常以大写字母开头,但JSON数据标准常用小写键名。本文将介绍如何利用encoding/json包的结构体标签(struct tags)功能,轻松实现Go结构体到JSON的转换过程中,将大写字段名映射为小写或其他自定义格式的JSON键名,确保数据格式的兼容性和规范性。

Go语言与JSON键名规范

go语言的可见性规则规定,结构体中的字段如果需要被外部包访问或被encoding/json包处理,其名称必须以大写字母开头。然而,json数据格式的惯例通常倾向于使用小写字母、驼峰命名(camelcase)或蛇形命名(snake_case)作为键名。当我们将一个go结构体通过json.marshal转换为json字符串时,如果没有特殊处理,默认情况下会直接使用go结构体字段的大写名称作为json键名,例如:

type T struct {
    Foo int
}

// ...
out, err := json.Marshal(&T{Foo: 42})
// 结果: {"Foo":42}

这与我们期望的{"foo":42}不符,可能导致与前端或其他系统的数据交互问题。

利用结构体标签(Struct Tags)自定义JSON键名

encoding/json包提供了一种强大且灵活的机制来控制JSON序列化和反序列化的行为,即结构体字段标签(struct field tags)。通过在结构体字段声明后添加json:"key_name,options"形式的标签,我们可以指定JSON键名、忽略字段、处理空值等。

json标签的语法与应用

json标签的基本语法是json:"name,option1,option2..."。

  • name: 这是最重要的部分,用于指定在JSON中该字段对应的键名。例如,json:"foo"会将Go结构体字段Foo映射为JSON键foo。
  • omitempty: 这是一个常用的选项。如果字段的值是其类型的零值(例如,int的0,string的空字符串,slice或map的nil),则在JSON输出中会省略该字段。
  • -: 如果将name指定为-,则表示该字段在JSON序列化和反序列化时都将被完全忽略。

示例:

Powtoon
Powtoon

AI创建令人惊叹的动画短片及简报

下载

立即学习go语言免费学习笔记(深入)”;

package main

import (
    "encoding/json"
    "fmt"
)

// User 定义一个Go结构体,包含需要转换为小写JSON键名的字段
type User struct {
    ID        int    `json:"id"`           // 将大写ID映射为小写id
    FirstName string `json:"first_name"`   // 将FirstName映射为snake_case的first_name
    LastName  string `json:"last_name"`    // 将LastName映射为snake_case的last_name
    Email     string `json:"email,omitempty"` // 如果Email为空字符串,则在JSON中省略
    Password  string `json:"-"`            // 密码字段,完全忽略,不出现在JSON中
    Age       int    `json:"user_age"`     // 自定义键名
}

func main() {
    // 示例1: 所有字段都有值
    user1 := User{
        ID:        1,
        FirstName: "John",
        LastName:  "Doe",
        Email:     "john.doe@example.com",
        Password:  "securepassword123", // 此字段会被忽略
        Age:       30,
    }

    jsonOutput1, err := json.MarshalIndent(user1, "", "    ")
    if err != nil {
        fmt.Println("Error marshaling user1:", err)
        return
    }
    fmt.Println("--- 示例1 (所有字段有值) ---")
    fmt.Println(string(jsonOutput1))
    // 期望输出:
    // {
    //     "id": 1,
    //     "first_name": "John",
    //     "last_name": "Doe",
    //     "email": "john.doe@example.com",
    //     "user_age": 30
    // }

    fmt.Println("\n--- 示例2 (包含零值字段) ---")
    // 示例2: 包含零值字段 (Email为空)
    user2 := User{
        ID:        2,
        FirstName: "Jane",
        LastName:  "Smith",
        Email:     "", // Email为空字符串
        Password:  "anotherpassword",
        Age:       25,
    }

    jsonOutput2, err := json.MarshalIndent(user2, "", "    ")
    if err != nil {
        fmt.Println("Error marshaling user2:", err)
        return
    }
    fmt.Println(string(jsonOutput2))
    // 期望输出:
    // {
    //     "id": 2,
    //     "first_name": "Jane",
    //     "last_name": "Smith",
    //     "user_age": 25
    // }
    // 注意:Email字段因omitempty被省略
}

代码解析

  1. ID intjson:"id"``: 将Go结构体字段ID(大写)在JSON中表示为id(小写)。
  2. FirstName stringjson:"first_name"``: 将FirstName映射为first_name,这是一种常见的蛇形命名(snake_case)转换。
  3. Email stringjson:"email,omitempty"``: 字段Email将被映射为email。同时,omitempty选项确保如果Email的值是空字符串(""),则该字段不会出现在最终的JSON输出中。
  4. Password stringjson:"-"``: 字段Password使用了"-"标签。这意味着无论Password字段的值是什么,它都将被json.Marshal完全忽略,不会出现在JSON输出中。这对于敏感信息(如密码)非常有用。
  5. json.MarshalIndent: 在示例中,我们使用了json.MarshalIndent而不是json.Marshal。MarshalIndent会生成带有缩进的、更易读的JSON输出,这在调试时非常有用。其第二个参数是前缀,第三个参数是缩进字符串。

注意事项与最佳实践

  • 一致性:在整个项目中保持JSON键名命名约定的一致性(例如,全部小写、全部snake_case等)非常重要,这有助于提高API的清晰度和可维护性。
  • 反序列化:这些json标签同样适用于json.Unmarshal。当JSON数据中的键名与标签中指定的name匹配时,Unmarshal会自动将其映射到对应的Go结构体字段。
  • 性能影响:使用结构体标签对性能的影响微乎其微,可以放心地在生产环境中使用。
  • 嵌套结构体:对于嵌套的结构体,你可以在每个结构体内部定义其字段的json标签,以实现细粒度的控制。
  • 第三方库:一些ORM或HTTP框架(如GORM、Gin)也可能使用结构体标签来定义数据库列名、路由参数等,注意避免标签冲突或理解不同标签的语义。

总结

通过encoding/json包提供的结构体标签功能,Go语言开发者可以轻松、灵活地控制JSON序列化和反序列化的行为。无论是将大写字段名转换为小写、实现驼峰命名或蛇形命名,还是根据字段值有条件地省略字段,结构体标签都提供了一个简洁而强大的解决方案,确保Go应用程序能够生成符合各种API规范和数据格式要求的JSON数据。掌握这一技巧是Go语言进行Web开发和数据交换的关键能力之一。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

310

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

75

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1490

2023.10.24

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号