繁体   English   中英

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

[英]Golang JSON array of different types reflection: 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类型。 知道为什么吗? 这是预期的行为吗?

这是Unmarshal记录的行为。 所有数字都被编组到float64中。

要将JSON解组为接口值,Unmarshal将其中之一存储在接口值中:

  • bool,用于JSON布尔值
  • float64,用于JSON数字
  • 字符串,用于JSON字符串
  • [] interface {},用于JSON数组
  • map [string] interface {},用于JSON对象
  • 对于JSON为null

这是因为JSON没有整数,所以JSON中的每个数字都定义为64位浮点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM