go语言踩坑:json反序列化为interface{}踩坑
场景
输入json字符串,转为map[string]interface{},然后,使用值的时候断言发现报错
interface conversion: interface {} is float64, not int
但是我的输入根本没有float64,这是我的输入
{
"planName": "SmallVersionUpgrade",
"type": "cache",
"version": "9.9.9",
"__upgrade_interface__": 1
}
原因
官方文档里没有找到原因,我觉得这里是go语言,断言的bug,但是写demo验证了一下断言没问题
测试demo
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte(`{
"planName": "SmallVersionUpgrade",
"type": "cache",
"version": "9.9.9",
"__upgrade_interface__": 1
}`)
var otherPlan map[string]interface{}
err := json.Unmarshal(data, &otherPlan)
if err != nil {
fmt.Println("JSON unmarshal error:", err)
return
}
//print(otherPlan["__upgrade_interface__"].(int))
if otherPlan["planName"] == "SmallVersionUpgrade" {
if upgradeInterface, ok := otherPlan["__upgrade_interface__"].(float64); ok {
upgradeInterfaceInt := int(upgradeInterface)
fmt.Println("Upgrade Interface:", upgradeInterfaceInt)
} else {
fmt.Println("Upgrade Interface type assertion failed")
}
} else {
fmt.Println("Plan name is not SmallVersionUpgrade")
}
var x interface{} = 7 //x的动态类型为int,值为7
i := x.(int) // i的类型为int ,值为7
print(i)
}
猜想,这里是json解码的问题?确认是的,官方注释里看到了
总结
感觉json反序列化的时候,还是应该少使用map[string]interface{},反结构体更好
可以使用
https://www.bejson.com/transfor/json2go/