ホームページ >バックエンド開発 >Golang >Go の浮動小数点数の JSON マーシャリングで末尾のゼロを保持するにはどうすればよいですか?

Go の浮動小数点数の JSON マーシャリングで末尾のゼロを保持するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 20:19:10831ブラウズ

How Can I Preserve Trailing Zeroes in Go's JSON Marshaling of Floating-Point Numbers?

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"
}

注:

  • カスタム MarshalJSON () メソッドはシリアル化される型で定義する必要があります。
  • float の場合整数 (小数部なし) を表す場合、曖昧さを避けるために浮動小数点数の代わりに整数型を使用することを検討してください。

以上がGo の浮動小数点数の JSON マーシャリングで末尾のゼロを保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。