设置JSON的默认值是指当JSON中不存在某个键或该键对应的值为空时,使用预设的默认值来填充这个键对应的值。在Go语言中,可以使用“omitempty”选项或者自定义UnmarshalJSON函数来实现设置JSON的默认值操作。
下面是实现设置JSON默认值的两种方法及其示例说明:
方法一:使用“omitempty”选项
在结构体中,在JSON标记中添加“omitempty”选项即可设置默认值。例如:
type User struct {
Name string `json:"name,omitempty"` // Name字段的默认值为""
Age int `json:"age,omitempty"` // Age字段的默认值为0
}
当Name或Age的值为空时(即Name为""或Age为0),这个键值对将不会被编码到JSON中。
示例代码1:将结构体User编码为JSON字符串,并设置默认值。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}
func main() {
user := User{Name: "", Age: 0} // 设置默认值
jsonBytes, err := json.Marshal(user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(jsonBytes)) // 输出结果:{}
}
示例代码2:将JSON字符串解码为结构体User,并设置默认值。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}
func main() {
var user User
jsonStr := `{"name":"","age":0}` // 设置默认值
if err := json.Unmarshal([]byte(jsonStr), &user); err != nil {
fmt.Println(err)
return
}
fmt.Printf("%+v\n", user) // 输出结果:{Name: Age:}
}
方法二:自定义UnmarshalJSON函数
在结构体中自定义UnmarshalJSON函数,然后在函数中判断JSON中每一个可能为空的键是否为空,如果为空则使用预设的默认值来填充这个键对应的值。例如:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func (u *User) UnmarshalJSON(data []byte) error {
type Alias User // 别名,避免递归调用UnmarshalJSON
a := &struct {
*Alias
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}{
Alias: (*Alias)(u),
}
if err := json.Unmarshal(data, &a); err != nil {
return err
}
if a.Name == "" {
a.Name = "default_name" // 设置默认值
}
if a.Age == 0 {
a.Age = 18 // 设置默认值
}
*u = User(*a.Alias)
return nil
}
示例代码3:将JSON字符串解码为结构体User,并设置默认值。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func (u *User) UnmarshalJSON(data []byte) error {
type Alias User
a := &struct {
*Alias
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}{
Alias: (*Alias)(u),
}
if err := json.Unmarshal(data, &a); err != nil {
return err
}
if a.Name == "" {
a.Name = "default_name"
}
if a.Age == 0 {
a.Age = 18
}
*u = User(*a.Alias)
return nil
}
func main() {
var user User
jsonStr := `{"name":"","age":0}` // 设置默认值
if err := json.Unmarshal([]byte(jsonStr), &user); err != nil {
fmt.Println(err)
return
}
fmt.Printf("%+v\n", user) // 输出结果:{Name:default_name Age:18}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言设置JSON的默认值操作 - Python技术站