2017-06-26 5 views
1

私はencoding/jsonを使ってstructをserializeします。私はjson.Marshalの出力について混乱しています。シリアライズされたフィールドの内容は、厳密に構造体定義の順序に従っていますか?シリアル化されたコンテンツは、定義のエンコーディング/ jsonパッケージの使用順に厳密に従っていますか?

ここに構造体定義があります

type MyStruct struct { 
    Field1 string 
    Field2 string 
} 

出力は{"Field2":"field2","Field1":"field1"}でしたか?出力構造体のフィールドが順不同である場合、直列化されたコンテンツのハッシュは不確実です。

+0

カスタムビヘイビアを作成する唯一の方法は、 '' 'json.Marshaler'''を実装するカスタムマーシャラを作成することです – bayrinat

答えて

3

現在の実装は確定的です。構造体の場合はhttps://golang.org/src/encoding/json/encode.go#L629を参照してください。これは構造体の順序を示します(マップはソートされたキーによるものです)。

しかし、ではなく、であることが保証されていますので、実装の詳細を検討する必要があります。

出力をハッシュしたい場合、より多くの問題に直面します。文字列にはいくつかの同等の文字表現があり、JSONにはint(浮動小数点数のみ)という概念はありません。それは本当にあなたがそのハッシュをしようとするものに依存します。

2

シリアル化されたフィールドの内容は、厳密に構造体定義の順序に従っていますか?

いいえ、これは保証されません。実際には、構造体などの多くのデータ型では当てはまるかもしれませんが、マップの場合は確かに当てはまりませんし、GoのバージョンやGoコンパイラ間で実装の詳細が変わる可能性があるため、そのような場合に一貫した注文を引き受けるとしたら、バグを導入する可能性があります。

特定のデータ型で注文が重要な場合は、注文を保存するカスタムjson.Marshalerを実装することができます。

関連する問題