json unmarshal bool兼容string

在公司实习的时候,调用json.Unmarshal,报错,可是我的结构体其实是看了redis的json结构的,为什么会出现错误呢?细看才发现,有一个字段有false,有"0",我的结构体字段中是string,当然会报错。

type MyStruct struct {
	...
	Valid     pto.BoolString `json:"valid"
	...
}

就是这个valid字段,那么如何兼容bool和string呢?

我们可以用type重新定义一个兼容bool string的类型。

type BoolString string

接着让他实现接口即可

func (i *BoolString) Set(val string) {
	*i = BoolString(val)
}

func (i *BoolString) Equal(val string) bool {
	return string(*i) == val
}

func (i *BoolString) Val() string {
	return string(*i)
}

func (i *BoolString) BoolVal() bool {
	if string(*i) == "0" {
		return false
	} else if string(*i) == "1" {
		return true
	}
	return false
}
// 主要是这个接口
func (i *BoolString) UnmarshalJSON(value []byte) error {
	if value[0] == '"' {
		var val string
		json.Unmarshal(value, &val)
		*i = BoolString(val)
	} else {
		var flag bool
		json.Unmarshal(value, &flag)
		if flag {
			*i = "1"
		} else {
			*i = "0"
		}
	}
	return nil
}
在Go语言中,判断结构体是否为空可以通过判断结构体的各个字段是否为空来实现。对于使用`json.Unmarshal`解析后的结构体,你可以通过判断其中的字段是否为其零值来确定结构体是否为空。以下是一个示例代码: ```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } func IsEmptyStruct(s interface{}) bool { // 将结构体转换为JSON字符串 jsonStr, _ := json.Marshal(s) // 判断JSON字符串是否为空 return string(jsonStr) == "{}" } func main() { // 示例1:空结构体 var p1 Person fmt.Println("Is p1 empty?", IsEmptyStruct(p1)) // 示例2:非空结构体 p2 := Person{Name: "Alice", Age: 30, Email: "alice@example.com"} fmt.Println("Is p2 empty?", IsEmptyStruct(p2)) } ``` 在上述代码中,我们定义了一个`Person`结构体,并实现了一个`IsEmptyStruct`函数来判断结构体是否为空。函数内部先将结构体转换为JSON字符串,然后判断该JSON字符串是否为空。如果JSON字符串为空字符串`{}`,则说明结构体为空;否则,结构体不为空。 在示例中,我们分别创建了一个空结构体`p1`和一个非空结构体`p2`,并通过调用`IsEmptyStruct`函数来判断它们是否为空。 请注意,这种方法只能判断结构体中的字段是否为空,不能判断结构体中的嵌套结构体是否为空。如果需要判断嵌套结构体的空值,可以递归地对嵌套结构体进行判断。同时,结构体的零值和空值的定义可能因字段类型的不同而不同,需要根据实际情况进行判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值