为了账号安全,请及时绑定邮箱和手机立即绑定

不同类型反射的Golang JSON数组:float64 vs int64

不同类型反射的Golang JSON数组:float64 vs int64

Go
扬帆大鱼 2021-10-04 16:31:30
考虑这个简单的例子: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 位浮点数。


查看完整回答
反对 回复 2021-10-04
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

这是 JSON 解码器的默认行为。您可以json.Number使用UseNumber方法将其更改为输出。


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信