序列化内容是否严格遵循使用encoding/json包定义的顺序?

ron*_*lei 3 json go

我用来encoding/json序列化结构。我对函数的输出感到困惑json.Marshal。序列化的字段内容是否严格遵循结构体定义中的顺序?

例如这是一个结构体定义

type MyStruct struct {
    Field1  string
    Field2  string
}
Run Code Online (Sandbox Code Playgroud)

输出可以是吗{"Field2":"field2","Field1":"field1"}?因为如果输出结构体字段乱序,则序列化内容的哈希值将是不确定的。

Vol*_*ker 6

当前的实现是确定性的,例如,对于结构,请参阅https://golang.org/src/encoding/json/encode.go#L629,它给出了结构顺序(并且映射按排序键排序)。

但由于文档不能保证这一点,因此您应该将其视为实现细节。

如果你想对输出进行哈希处理,你将面临更多问题,例如,字符串中的字符有几种等效的表示形式,而 JSON 没有 int 的概念(仅浮点数)。这实际上取决于您尝试使用该哈希做什么。