Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengekalkan Ketepatan Int64 Apabila Menghuraikan JSON dalam Go?

Bagaimana untuk Mengekalkan Ketepatan Int64 Apabila Menghuraikan JSON dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-08 07:32:27233semak imbas

How to Preserve Int64 Precision When Parsing JSON in Go?

Kekalkan Nilai Int64 Apabila Menghuraikan JSON dalam Go

Apabila menghuraikan data JSON dalam Go, fungsi json.Unmarshal sering menukar nilai integer besar kepada float64 jenis, yang boleh menjadi masalah untuk mengekalkan ketepatan.

Penyelesaian 1:

Untuk mengekalkan nilai int64 asal, gunakan penyahkod dan pilihan UseNumber:

package main

import (
    "encoding/json"
    "fmt"
    "bytes"
    "strconv"
)

func main() {
    body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}")
    d := json.NewDecoder(bytes.NewBuffer(body))

    // Enable number preservation
    d.UseNumber()

    var dat map[string]interface{}
    if err := d.Decode(&dat); err != nil {
        panic(err)
    }

    tags := dat["tags"].([]interface{})
    n := tags[0].(map[string]interface{})["id"].(json.Number)
    i64, _ := strconv.ParseUint(string(n), 10, 64)
    fmt.Println(i64) // prints 4418489049307132905
}

Penyelesaian 2:

Sebagai alternatif, anda boleh menyahkod terus ke dalam struktur data tersuai:

package main

import (
    "encoding/json"
    "fmt"
)

type A struct {
    Tags []map[string]uint64 // "tags"
}

func main() {
    body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}")
    var a A
    if err := json.Unmarshal(body, &a); err != nil {
        panic(err)
    }

    fmt.Println(a.Tags[0]["id"]) // logs 4418489049307132905
}

Awas:

Perhatikan bahawa jenis nombor JavaScript ialah apungan berketepatan ganda IEEE754, yang bermaksud ia tidak boleh mewakili integer 64-bit tanpa kehilangan ketepatan.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Ketepatan Int64 Apabila Menghuraikan JSON dalam 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