首頁 >後端開發 >Golang >如何在 Go 的浮點數 JSON 封送處理中保留尾隨零?

如何在 Go 的浮點數 JSON 封送處理中保留尾隨零?

Linda Hamilton
Linda Hamilton原創
2024-11-27 20:19:10781瀏覽

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

JSON 編組:保留浮點數中的尾隨零​​

在Go 中使用json.Marshal() 將資料序列化為JSON 時,尾隨浮點數中的零經常被去掉。當接收端期望帶有小數位的浮點值時,這可能會出現問題。

解決方案:自訂Marshal 函數

防止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 類型定義了一個自訂MarshalJSON() 方法,該方法檢查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 (MarshalJSON (MarshalJSON)必須在要序列化的類型上定義。 如果 float 代表一個整數(沒有小數部分),您可以考慮使用整數類型而不是浮點數以避免任何歧義。

以上是如何在 Go 的浮點數 JSON 封送處理中保留尾隨零?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn