Sco*_*iel 3 json marshalling go unmarshalling
看来,如果我在 Go 中有一个按照特定顺序的接口{},并且我将其编组为 [] 字节,然后将其解组回接口{},则它应该保留原始顺序。它不是。结果是 DeepEqual 无法匹配两者,如下面的程序所示。
package main
import (
"encoding/json"
"fmt"
"reflect"
)
func main() {
var jd interface{}
j := map[string]interface{}{
"A": map[string]interface{}{"a": 1, "b": 2, "c": 3},
"B": map[string]interface{}{"a": 1, "b": 2, "c": 3},
"C": map[string]interface{}{
"a": map[string]interface{}{"a": 1, "b": 2, "c": 3},
"b": map[string]interface{}{"a": 1, "b": 2, "c": 3},
"c": map[string]interface{}{"a": 1, "b": 2, "c": 3},
},
}
s, _ := json.Marshal(j)
_ = json.Unmarshal(s, &jd)
fmt.Println(string(s))
fmt.Println(j)
fmt.Println(jd)
if !reflect.DeepEqual(j, jd) {
fmt.Println("Fail!")
}
}
Run Code Online (Sandbox Code Playgroud)
该程序的结果是随机的,但这是一个典型的结果:
{"A":{"a":1,"b":2,"c":3},"B":{"a":1,"b":2,"c":3},"C":{"a":{"a":1,"b":2,"c":3},"b":{"a":1,"b":2,"c":3},"c":{"a":1,"b":2,"c":3}}}
map[B:map[a:1 b:2 c:3] C:map[c:map[a:1 b:2 c:3] a:map[b:2 c:3 a:1] b:map[a:1 b:2 c:3]] A:map[c:3 a:1 b:2]]
map[A:map[a:1 b:2 c:3] B:map[a:1 b:2 c:3] C:map[b:map[c:3 a:1 b:2] c:map[a:1 b:2 c:3] a:map[a:1 b:2 c:3]]]
Fail!
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这些值 Marshal 为原始顺序,而 Unmarshal 为随机顺序(多次运行此程序将产生不同的结果)。结果是 DeepEqual 比较每次都失败(到目前为止)。
这是 Go 中的错误吗?有人可以建议解决方法吗?
| 归档时间: |
|
| 查看次数: |
2159 次 |
| 最近记录: |