猿问

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

考虑这个简单的例子:


package main


import (

    "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 1

float64 2.5

string aaa

bool true

bool false

如您所见,我的输入是一个有效的 JSON,它表示一个包含五个项目的数组:


- integer

- floating point number

- string

- boolean

- boolean

当我将有效的 JSON 字符串解组到 []interface{} 并尝试使用反射检查类型时,来自 JSON 的整数值的类型为 float64。知道为什么吗?这是预期的行为吗?


扬帆大鱼
浏览 344回答 2
2回答

慕姐8265434

这是Unmarshal. 所有数字都被解组为 float64。要将 JSON 解组为接口值,Unmarshal 将其中之一存储在接口值中:bool,用于 JSON 布尔值float64,用于 JSON 数字字符串,用于 JSON 字符串[]接口{},用于 JSON 数组map[string]interface{},用于 JSON 对象nil 表示 JSON null这是因为 JSON 没有整数,JSON 中的每个数字都定义为 64 位浮点数。

幕布斯6054654

这是 JSON 解码器的默认行为。您可以json.Number使用UseNumber方法将其更改为输出。
随时随地看视频慕课网APP

相关分类

Go
我要回答