JSON マーシャリング: 浮動小数点数の末尾のゼロの保持
Go で json.Marshal() を使用してデータを JSON にシリアル化する場合、末尾浮動小数点数のゼロは、多くの場合削除されます。これは、受信側が小数点以下の桁を含む浮動小数点値を予期している場合に問題になる可能性があります。
解決策: カスタム マーシャル関数
json.Marshal() を防ぐ効果的な方法末尾のゼロを削除するには、浮動小数点値を含む型のカスタム MarshalJSON() メソッドを定義します。これにより、シリアル化プロセスを手動で制御できます。
次の例を考えてみましょう:
type MyFloat float64 func (f MyFloat) MarshalJSON() ([]byte, error) { // Check if the float is an integer (no decimal part). if math.Trunc(float64(f)) == float64(f) { // Serialize as an integer without the trailing zero. return []byte(strconv.FormatInt(int64(f), 10)), nil } // Serialize as a floating-point number with the trailing zero. return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)), nil }
この例では、MyFloat 型は、Float が整数 (小数部分なし) を入力し、それに応じてシリアル化します。浮動小数点数の場合は、末尾のゼロをそのままにしてシリアル化します。
使用法:
カスタム MarshalJSON() メソッドを定義したら、それを使用できます。 MyFloat 型を含むオブジェクトをシリアル化します。例:
type MyStruct struct { Value MyFloat Unit string } // Serialize MyStruct using the custom MarshalJSON method. data, err := json.Marshal(MyStruct{40.0, "some_string"})
これにより、次の JSON 出力が生成されます:
{ "Value": 40.0, "Unit": "some_string" }
注:
以上がGo の浮動小数点数の JSON マーシャリングで末尾のゼロを保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。