Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json DeepEqual:为什么非编组映射返回的DeepEqual()结果与看似相同的文本不同_Json_Go - Fatal编程技术网

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

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

我不明白如何比较未签名的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))
}
印刷品

文字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如果这回答了您的问题,您应该接受它。