DeepEqual:为什么非编组映射返回DeepEqual()的结果与看似相同的文字不同

时间:2015-07-23 20:55:46

标签: json go

我不明白如何比较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有什么不同?

1 个答案:

答案 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