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

时间:2017-06-26 07:47:22

标签: json go

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

e.g。这是一个结构定义

type MyStruct struct {
    Field1  string
    Field2  string
}

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

2 个答案:

答案 0 :(得分:3)

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

但是由于文档保证,您应该将此视为实现细节。

如果您想对输出进行哈希处理,则会遇到更多问题,例如:字符串中有几个等效的字符表示,而JSON没有int的概念(仅浮点数)。这实际上取决于你试图用哈希做什么。

答案 1 :(得分:2)

  

序列化字段内容是否严格遵循结构定义中的顺序?

没有。无法保证这一点。实际上,虽然对于许多数据类型(例如结构体)可能都是如此,但对于地图来说肯定不是这样,并且应该永远不要依赖于保持相同的顺序,因为实现细节可以在Go版本甚至Go编译器之间改变如果你在这种情况下假设一致排序,你可能会引入错误。

如果订购对您的特定数据类型很重要,您可以实施保留订单的自定义json.Marshaler