gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:50:21 27 4
gpt4 key购买 nike

考虑这个简单的例子:

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。

To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:

  • bool, for JSON booleans
  • float64, for JSON numbers
  • string, for JSON strings
  • []interface{}, for JSON arrays
  • map[string]interface{}, for JSON objects
  • nil for JSON null

这是因为 JSON 没有整数,JSON 中的每个数字都被定义为 64 位 float 。

关于json - 不同类型反射的 Golang JSON 数组 : float64 vs int64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30105688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com