将 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 数字解码为浮点数。来自文档:
Floating point, integer, and Number values encode as JSON numbers.
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
我有这个代码。我希望接口的类型断言为 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 数字解码为浮点数。来自文档:
Floating point, integer, and Number values encode as JSON numbers.
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