Golang jsonTag

Golang中,json Tag用于结构体对象编解码,指定编解码时的键和选项。例如,未设置jsonTag时,键与结构体成员名相同;设置后,键与jsonTag内容一致。一个成员可有多个Tag,如`json:"name,opt1,opt2"`,常见的选项有omitempty(值为空时不编码)和string(转为string类型)。`-`选项会完全忽略属性的编解码。通过reflect包可以获取jsonTag,`json:"-"`确保属性不参与编解码。" 127675287,9540006,Linux环境下C/C++封装MySQL连接库,"['Linux开发', 'C++编程', '数据库接口', 'MySQL连接']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

json Tag

type Student struct {    
    Name string `json:"name"`    
    Age int32 `json:"age"`    
    Class string `json:"class"`
}

Tag就是跟在结构体成员之后单引号中的内容,它的作用是用来当结构体对象进行编解码时,提供编/解码的方案。

举例说明:

package main
import (    
    "fmt"    
    "encoding/json"
)

type Student struct {
    Name string    
    Age int32    
    Class string
}

func main() {
    stu := Student {
        Name: "ahaoozhang", 
        Age: 18,    
        Class: "电信1605班",    
    }       
    json, _ := json.Marshal(stu)	//对stu结构体进行json编码
    fmt.Println(string(json))	//打印json字符串
}
//执行的结果为:
// {"Name":"ahaoozhang","Age":18,"Class":"电信1605班"}

注意这种情况是在不包含jsonTag的情况下的编码结果,可以看出json字符串中的key与结构体成员名完全相同(包括大小写)。

package main
import (    
    "fmt"  
    "encoding/json"
)

type Student struct {
    Name string `json:"name"` 
    Age int32 `json:"age"`
    Class string `json:"class"`
}

func main() {  
    stu := Student {     
        Name: "ahaoozhang",  
        Age: 18,  
        Class: "电信1605班",   
    }       
    json, _ := json.Marshal(stu)	//对stu结构体进行json编码
    fmt.Println(string(json))	//打印json字符串
}
//执行的结果为:
// {"name":"ahaoozhang","age":18,"class":"电信1605班"}

可以看出在使用了jsonTag的情况下,编码后的json字符串Key与jsonTag中的内容一致。

Tag的功能并不止于此,结构体的一个成员可以有多个Tag,多个Tag之间使用空格隔开

通常一个jsonTag可以分为两部分,分别为属性名和选项,这两部分使用,隔开,属性名也就是上面所说的编/解码时替换Key的功能,通常使用的选项分别有"-"omitempty

  • -:在编/解码时直接忽略当前属性
  • omitempty:在编/解码时,如果当前属性的值为空(nil),则忽略当前属性
  • string:在编/解码时,将对应的value转换为json的string类型

举例说明:

package main
import (   
    "fmt"  
    "encoding/json"
)

type Student struct {
    Name string `json:"-"`   
    Age int32 `json:"age"`
    Class string `json:"class"` 
    Ptr uintptr `json:"ptr,omitempty"` 
    Num int32 `json:"num,string"`
}

func main() { 
    stu := Student {    
        Name: "ahaoozhang", 
        Age: 18,    
        Class: "电信1605班", 
        Num: 2000,  
    }      
    json, _ := json.Marshal(stu)	//对stu结构体进行json编码
    fmt.Println(string(json))	//打印json字符串
}
//执行的结果为:{"age":18,"Class":"电信1605班","num":"2000"}

问题:在使用-选项时,jsonTag必须只包含-,才能完全忽略当前属性的编/解码

原理

使用reflect包可以获取到结构体的jsonTag,除了反射机制可以获得jsonTag以外,对于其他方式jsonTag都是不可见的。

这里主要介绍func (tag StructTag) Get(key string) string函数,该函数可以用来获取指定key的value。

提取jsonTag

package main
import (  
    "fmt" 
    "encoding/json"  
    "reflect"
)

type Student struct {
    Name string `json:"-" xml:"NAME"`
    Age int32 `json:"age" xml:"AGE"` 
    Class string `json:"class"`
    Ptr uintptr `json:"ptr,omitempty"`   
    Num int32 `json:"num,string"`
}

func main() {	
    stu := Student {  
        Name: "ahaoozhang", 
        Age: 18,    
        Class: "电信1605班",   
        Num: 2000,  
    }      
    stutype := reflect.TypeOf(stu) 
    for i := 0; i < stutype.NumField(); i++ {  
        field := stutype.Field(i)     
        fmt.Printf("json: %v; xml: %v\n",   field.Tag.Get("json"), field.Tag.Get("xml"))   
        fmt.Printf("%v\n", )   
    }
}
/*结果: * json: -; xml: NAME * json: age; xml: AGE * json: ; xml:  * json: num,string; xml:*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值