簡體   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