序列化内容是否严格遵循使用编码/json包的定义顺序?
我使用序列化内容是否严格遵循使用编码/json包的定义顺序?,json,go,Json,Go,我使用编码/json来序列化结构。我对json.Marshal函数的输出感到困惑。序列化字段内容是否严格遵循结构定义中的顺序 e、 这里是一个结构定义 type MyStruct struct { Field1 string Field2 string } 输出是否可以是{“Field2”:“Field2”,“Field1”:“Field1”}?因为如果输出结构字段的顺序不正确,序列化内容的哈希将是不确定的 序列化字段内容是否严格遵循结构定义中的顺序 不,这不能保证。在实践
编码/json
来序列化结构。我对json.Marshal
函数的输出感到困惑。序列化字段内容是否严格遵循结构定义中的顺序
e、 这里是一个结构定义
type MyStruct struct {
Field1 string
Field2 string
}
输出是否可以是{“Field2”:“Field2”,“Field1”:“Field1”}
?因为如果输出结构字段的顺序不正确,序列化内容的哈希将是不确定的
序列化字段内容是否严格遵循结构定义中的顺序
不,这不能保证。在实践中,虽然对于许多数据类型(如结构)可能是正确的,但对于映射肯定不是正确的,人们永远不应该依赖于保持不变的顺序,因为实现细节可能会在Go版本之间甚至Go编译器之间发生变化,如果在这种情况下假设一致的顺序,则可能会引入错误
如果排序对于特定数据类型很重要,则可以实现保留顺序的自定义。当前的实现是确定性的,例如,对于结构,请参见哪个给出了结构顺序(映射是按键排序的)
但由于文档不能保证这一点,您应该考虑这一实现细节。
如果你想散列输出,你将面临更多的问题,例如,字符串中有几个等价的字符表示,JSON没有int的概念(仅浮点)。这实际上取决于您试图使用该散列执行的操作。实现自定义行为的唯一方法是创建实现
json.Marshaler的自定义封送拆收器。