Json DeepEqual:为什么非编组映射返回的DeepEqual()结果与看似相同的文本不同
我不明白如何比较未签名的JSON。例如:Json DeepEqual:为什么非编组映射返回的DeepEqual()结果与看似相同的文本不同,json,go,Json,Go,我不明白如何比较未签名的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, DeepEq
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))
}
印刷品
文字B是map[bar:2foo:1],DeepEqual是true
Umarshalled B是map[bar:2 foo:1],DeepEqual是false
从一个文本初始化的B和在解封JSON后初始化的B有什么不同?这回答了您的问题:
fmt.Printf("%T\n", b["foo"]) // Prints "float64" after unmarshaling.
JSON数字是64位浮点数,而原始映射值是整数。从:
要将JSON解组为接口值,解组将在接口值中存储以下内容之一:
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
完美的我改为:=map[string]接口{}{“foo”:1.0,“bar”:2.0};b:=map[string]接口{}{“bar”:2.0,“foo”:1.0},并按预期工作。@esnible如果这回答了您的问题,您应该接受它。