Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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包的定义顺序?_Json_Go - Fatal编程技术网

序列化内容是否严格遵循使用编码/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的自定义封送拆收器。