[英]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.