考虑这个简单的例子:package mainimport ( "encoding/json" "fmt" "log" "reflect")var args = `[1, 2.5, "aaa", true, false]`func main() { var x []interface{} err := json.Unmarshal([]byte(args), &x) if err != nil { log.Fatalf("%s", err.Error()) panic(fmt.Sprintf("%s", err.Error())) } for _, arg := range x { t := reflect.TypeOf(arg).Kind().String() v := reflect.ValueOf(arg) if t == "int64" { fmt.Printf("int64 %v\n", v.Int()) } if t == "float64" { fmt.Printf("float64 %v\n", v.Float()) } if t == "string" { fmt.Printf("string %v\n", v.String()) } if t == "bool" { fmt.Printf("bool %v\n", v.Bool()) } }}程序输出:float64 1float64 2.5string aaabool truebool false如您所见,我的输入是一个有效的 JSON,它表示一个包含五个项目的数组:- integer- floating point number- string- boolean- boolean当我将有效的 JSON 字符串解组到 []interface{} 并尝试使用反射检查类型时,来自 JSON 的整数值的类型为 float64。知道为什么吗?这是预期的行为吗?
2 回答
慕姐8265434
TA贡献1813条经验 获得超2个赞
这是Unmarshal
. 所有数字都被解组为 float64。
要将 JSON 解组为接口值,Unmarshal 将其中之一存储在接口值中:
bool,用于 JSON 布尔值
float64,用于 JSON 数字
字符串,用于 JSON 字符串
[]接口{},用于 JSON 数组
map[string]interface{},用于 JSON 对象
nil 表示 JSON null
这是因为 JSON 没有整数,JSON 中的每个数字都定义为 64 位浮点数。
- 2 回答
- 0 关注
- 343 浏览
添加回答
举报
0/150
提交
取消