将 JSON 整数解组为空接口会导致错误的类型断言

Unmarshaling a JSON integer to an empty interface results in wrong type assertion

我有这个代码。我希望接口的类型断言为 int。但是,接口的类型改为 float64。谁能解释为什么会这样?规避它的最佳方法是什么。

package main

import (
    "fmt"
    "encoding/json"
)

type obj struct {
    X interface{}
}

func main() {
    var x int
    x = 5
    o := &obj {
        X: x,
    }
    b, _ := json.Marshal(o)
    var newObj obj
    json.Unmarshal(b, &newObj)
    if _, ok := newObj.X.(int); ok {
        fmt.Println("X is an int")
    } else if _, ok := newObj.X.(float64); ok {
        fmt.Println("X is a float64")
    } else {
        fmt.Println("This does not make any sense")
    }
}

此代码打印 "X is a float64"。您可以 运行 那里的代码 https://play.golang.org/p/9L9unW8l3n

数字编码为 "Json numbers" Unmarshal 将 Json 数字解码为浮点数。来自文档:

Marshal

Floating point, integer, and Number values encode as JSON numbers.

Unmarshal

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