我不明白如何比较unmarshalled JSON。例如:
package main
import (
"fmt"
"reflect"
"encoding/json"
)
func main() {
a := map[string]interface{} {"foo": 1, "bar": 2}
b := map[string]interface{} {"bar": 2, "foo": 1}
fmt.Printf("Literal B is %v, DeepEqual is %v\n", b, reflect.DeepEqual(a, b))
err := json.Unmarshal([]byte(`{"bar": 2, "foo": 1}`), &b)
if err != nil {
panic("Could not unmarshal")
}
fmt.Printf("Umarshalled B is %v, DeepEqual is %v\n", b, reflect.DeepEqual(a, b))
}
打印
Literal B是map [bar:2 foo:1],DeepEqual是 true
Umarshalled B是地图[bar:2 foo:1],DeepEqual是 false
在JSON被解组之后,从文字和B初始化的B有什么不同?
答案 0 :(得分:2)
这回答了你的问题:
fmt.Printf("%T\n", b["foo"]) // Prints "float64" after unmarshaling.
JSON数字是64位浮点数,而原始地图值是整数。来自docs:
要将JSON解组为接口值,Unmarshal会将其中一个存储在接口值中:
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