Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengekalkan Sifar Mengekori dalam JSON Marshaling Nombor Titik Terapung Go?

Bagaimanakah Saya Boleh Mengekalkan Sifar Mengekori dalam JSON Marshaling Nombor Titik Terapung Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-27 20:19:10781semak imbas

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

JSON Marshaling: Mengekalkan Sifar Mengekor dalam Nombor Titik Terapung

Apabila mensiri data ke dalam JSON menggunakan json.Marshal() dalam Go, mengekor sifar dalam nombor titik terapung sering dilucutkan. Ini boleh menjadi masalah apabila hujung penerima menjangkakan nilai titik terapung dengan tempat perpuluhan.

Penyelesaian: Fungsi Marshal Tersuai

Cara yang berkesan untuk menghalang json.Marshal() daripada mengalih keluar sifar mengekor adalah untuk menentukan kaedah MarshalJSON() tersuai untuk jenis yang mengandungi nilai titik terapung. Ini membolehkan anda mengawal proses bersiri secara manual.

Pertimbangkan contoh berikut:

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
}

Dalam contoh ini, jenis MyFloat mentakrifkan kaedah MarshalJSON() tersuai yang menyemak sama ada apungan itu integer (tiada bahagian perpuluhan) dan mensirikannya dengan sewajarnya. Untuk nombor titik terapung, ia mensirikannya dengan sifar pengekoran utuh.

Penggunaan:

Setelah anda menentukan kaedah MarshalJSON() tersuai, anda boleh menggunakannya untuk menyerikan objek yang mengandungi jenis MyFloat. Contohnya:

type MyStruct struct {
    Value MyFloat
    Unit  string
}

// Serialize MyStruct using the custom MarshalJSON method.
data, err := json.Marshal(MyStruct{40.0, "some_string"})

Ini akan menghasilkan output JSON berikut:

{
  "Value": 40.0,
  "Unit": "some_string"
}

Nota:

  • MarshalJSON tersuai () kaedah mesti ditakrifkan pada jenis yang akan bersiri.
  • Jika apungan mewakili integer (tiada bahagian perpuluhan), anda boleh mempertimbangkan untuk menggunakan jenis integer dan bukannya apungan untuk mengelakkan sebarang kekaburan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekalkan Sifar Mengekori dalam JSON Marshaling Nombor Titik Terapung Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn