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" }
注意:
以上是如何在 Go 的浮點數 JSON 封送處理中保留尾隨零?的詳細內容。更多資訊請關注PHP中文網其他相關文章!