首页 > 其他分享 >GO: 结构体字段后面的 `json` 标注

GO: 结构体字段后面的 `json` 标注

时间:2024-12-25 13:30:10浏览次数:4  
标签:username string type JSON json GO 体字段 struct

在 Go 语言中,在 Go 语言中,结构体字段后面的 json 标注是用来 指定字段在 JSON 数据中的名称处理方式。这个标注告诉 Go 的 encoding/json 包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。

JSON 标注的基本语法:

type Example struct {
    Field1 string `json:"field1_name"`
    Field2 int    `json:"field2_name"`
}

标注格式解释:

  • json:"field1_name":告诉 encoding/json 包,在 JSON 中使用 field1_name 来表示结构体中的 Field1 字段。
  • 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。

常见的 JSON 标注选项:

  1. 字段名称映射

    • 你可以指定一个结构体字段在 JSON 中的名称。
    • 例如:json:"username" 说明结构体字段的名称是 username,而不是 UserName
    type User struct {
        Name     string `json:"username"`
        Age      int    `json:"age"`
    }
    
  2. 忽略某个字段

    • 使用 json:"-" 来告诉 json 包忽略该字段(即在序列化和反序列化时不处理该字段)。
    type User struct {
        Name     string `json:"username"`
        Password string `json:"-"`
    }
    

    在这个例子中,Password 字段会被忽略,不会出现在 JSON 中。

  3. 字段的零值处理

    • 如果一个字段的值为零值(例如 ""0false 等),可以通过使用 omitempty 标志来使得该字段在 JSON 输出时被忽略。
    type User struct {
        Name  string `json:"username,omitempty"`
        Age   int    `json:"age,omitempty"`
    }
    

    如果 NameAge 字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。

  4. 结构体的嵌套

    • 如果结构体是嵌套的,json 标注会自动应用到嵌套的字段。
    type Address struct {
        Street string `json:"street"`
        City   string `json:"city"`
    }
    
    type User struct {
        Name    string  `json:"username"`
        Address Address `json:"address"`
    }
    

    在这种情况下,嵌套结构体 Address 会被序列化成 address 字段,而 Address 结构体内的字段会被序列化为其对应的 JSON 键(例如,StreetCity)。


示例:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name     string `json:"username"`
    Age      int    `json:"age,omitempty"`
    Password string `json:"-"`
}

func main() {
    user := User{
        Name:     "Alice",
        Age:      0,  // 这里是零值
        Password: "secret",
    }

    // 将结构体转换为 JSON
    jsonData, _ := json.Marshal(user)
    fmt.Println(string(jsonData))  // 输出: {"username":"Alice"}
}

输出结果:

{"username":"Alice"}

在这个例子中,Age 字段因为是零值(0)被 omitempty 忽略,而 Password 字段因为使用了 json:"-" 被完全忽略,不出现在 JSON 输出中。


总结:

  • json 标注帮助我们控制结构体字段与 JSON 数据之间的映射。
  • 可以指定字段名、忽略字段、忽略零值字段。
  • 在序列化和反序列化过程中,json 标注提供了灵活的字段控制。是用来 指定字段在 JSON 数据中的名称处理方式。这个标注告诉 Go 的 encoding/json 包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。

JSON 标注的基本语法:

type Example struct {
    Field1 string `json:"field1_name"`
    Field2 int    `json:"field2_name"`
}

标注格式解释:

  • json:"field1_name":告诉 encoding/json 包,在 JSON 中使用 field1_name 来表示结构体中的 Field1 字段。
  • 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。

常见的 JSON 标注选项:

  1. 字段名称映射

    • 你可以指定一个结构体字段在 JSON 中的名称。
    • 例如:json:"username" 说明结构体字段的名称是 username,而不是 UserName
    type User struct {
        Name     string `json:"username"`
        Age      int    `json:"age"`
    }
    
  2. 忽略某个字段

    • 使用 json:"-" 来告诉 json 包忽略该字段(即在序列化和反序列化时不处理该字段)。
    type User struct {
        Name     string `json:"username"`
        Password string `json:"-"`
    }
    

    在这个例子中,Password 字段会被忽略,不会出现在 JSON 中。

  3. 字段的零值处理

    • 如果一个字段的值为零值(例如 ""0false 等),可以通过使用 omitempty 标志来使得该字段在 JSON 输出时被忽略。
    type User struct {
        Name  string `json:"username,omitempty"`
        Age   int    `json:"age,omitempty"`
    }
    

    如果 NameAge 字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。

  4. 结构体的嵌套

    • 如果结构体是嵌套的,json 标注会自动应用到嵌套的字段。
    type Address struct {
        Street string `json:"street"`
        City   string `json:"city"`
    }
    
    type User struct {
        Name    string  `json:"username"`
        Address Address `json:"address"`
    }
    

    在这种情况下,嵌套结构体 Address 会被序列化成 address 字段,而 Address 结构体内的字段会被序列化为其对应的 JSON 键(例如,StreetCity)。


示例:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name     string `json:"username"`
    Age      int    `json:"age,omitempty"`
    Password string `json:"-"`
}

func main() {
    user := User{
        Name:     "Alice",
        Age:      0,  // 这里是零值
        Password: "secret",
    }

    // 将结构体转换为 JSON
    jsonData, _ := json.Marshal(user)
    fmt.Println(string(jsonData))  // 输出: {"username":"Alice"}
}

输出结果:

{"username":"Alice"}

在这个例子中,Age 字段因为是零值(0)被 omitempty 忽略,而 Password 字段因为使用了 json:"-" 被完全忽略,不出现在 JSON 输出中。


总结:

  • json 标注帮助我们控制结构体字段与 JSON 数据之间的映射。

标签:username,string,type,JSON,json,GO,体字段,struct
From: https://www.cnblogs.com/niumachen/p/18630168

相关文章

  • 深入了解 Google Test (gtest):一份详细的指南
    GoogleTest(gtest)是Google提供的一款C++测试框架,它广泛应用于C++项目的单元测试。无论是初学者还是经验丰富的开发者,gtest都是一个强大而灵活的工具,能够帮助你编写和执行单元测试,确保你的代码质量和稳定性。本文将从gtest的基本概念到高级特性,逐步带你深入了解如何使用它......
  • Json转换工具类(基于google的Gson和阿里的fastjson)
    Json转换工具类(基于google的Gson和阿里的fastjson)|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------......
  • JSON
    JSON.toJSONString对象日期变为了时间戳|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|......
  • Springboot使用RestTemplate发送Post请求postForEntity (application-json)的坑
    Springboot使用RestTemplate发送Post请求postForEntity(application-json)的坑|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||---------......
  • 城市JSON
    城市JSON|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|-------------|-------------......
  • 2024/12/25 任务【multi-objective optimization algorithm 多目标优化算法】解决问题
    知识点:Git配合Github的简单使用,硕士开题报告:选题意义(10分),难易程度(5分),对国内外现状的综述(5分)论文的开题报告,写好这些就够了!_哔哩哔哩_bilibili:写清楚研究方向研究的意义现在做到什么程度存在哪些问题你想怎么解决准备用哪些数据去验证你的成果参考文献Github新手够用指......
  • MYSQL 如何匹配查询JSON字段
    在MySQL中,如果你存储的是JSON数据,并且需要检查某个JSON字段是否包含一个特定的键值对(例如{user1:1}),你可以使用MySQL提供的JSON函数来实现。1.使用JSON_CONTAINS()函数JSON_CONTAINS()函数可以检查一个JSON字段是否包含另一个JSON值。该函数返回一个布尔值,如......
  • golang并发测试http demo
    packagemainimport( "bytes" "fmt" "math/rand" "net/http" "sync" "time")const( url="http://127.0.0.1:8080"//请求的URL ratePerSecond=10......
  • Webpack DLL(Dynamic Link Library)和 `manifest.json`
    webpack使用dll实现编译缓存,manifest.json作为缓存目录功能使用在Webpack中,DLL(DynamicLinkLibrary)和manifest.json是两个不同的概念,它们在构建过程中扮演着不同的角色:DLL(动态链接库):DLL是一个包含预编译代码的二进制文件。它包含了第三方库或应用程序代码的编译结果......
  • Python+Vue3+Django银行信用卡额度管理系统的设计与实现
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、......