Ric*_*nop 1 reflection json go
考虑这个简单的例子:
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())
}
}
}
Run Code Online (Sandbox Code Playgroud)
该方案产出:
float64 1
float64 2.5
string aaa
bool true
bool false
Run Code Online (Sandbox Code Playgroud)
如您所见,我的输入是一个有效的JSON,它代表一个包含五个项目的数组:
- integer
- floating point number
- string
- boolean
- boolean
Run Code Online (Sandbox Code Playgroud)
当我将有效的JSON字符串解组到[] interface {}并尝试使用反射检查类型时,来自JSON的整数值的类型为float64.知道为什么吗?这是预期的行为吗?
这是记录在案的行为Unmarshal
.所有数字都被解组为float64.
要将JSON解组为接口值,Unmarshal会将其中一个存储在接口值中:
- bool,用于JSON布尔
- float64,用于JSON数字
- 字符串,用于JSON字符串
- [] interface {},用于JSON数组
- map [string] interface {},用于JSON对象
- n为JSON null
这是因为JSON没有整数,JSON中的每个数字都被定义为64位浮点.
归档时间: |
|
查看次数: |
1676 次 |
最近记录: |