Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengekalkan Ketepatan Integer 64-Bit Apabila Menghuraikan JSON dalam Go?

Bagaimana untuk Mengekalkan Ketepatan Integer 64-Bit Apabila Menghuraikan JSON dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-09 11:31:16984semak imbas

How to Preserve 64-Bit Integer Precision When Parsing JSON in Go?

Kekalkan Nilai Integer 64-Bit semasa Penghuraian JSON dalam Go

Dalam Go, menghuraikan data JSON yang mengandungi nilai integer 64-bit boleh mengakibatkan penukaran mereka kepada nilai float64, yang membawa kepada kehilangan ketepatan. Artikel ini menangani isu ini dengan mengemukakan dua penyelesaian untuk mengekalkan nilai integer asal semasa penghuraian JSON.

Penyelesaian 1: Menggunakan Penyahkod dan UseNumber

Dengan menggunakan UseNumber jenis Penyahkod kaedah, seseorang boleh mengarahkan penyahkod untuk merawat nilai berangka sebagai objek json.Nombor dan bukannya float64 nilai. json.Number boleh ditukar dengan mudah kepada jenis uint64 atau int64 menggunakan fungsi ParseUint atau ParseInt masing-masing.

Contoh:

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

body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`)

d := json.NewDecoder(bytes.NewBuffer(body))
d.UseNumber()
var dat map[string]interface{}
err := d.Decode(&dat)

tags := dat["tags"].([]interface{})
value := tags[0].(map[string]interface{})["id"].(json.Number)
id, _ := strconv.ParseUint(string(value), 10, 64)

fmt.Println(id) // Prints 4418489049307132905

Penyelesaian 2: Menyahkod ke dalam Custom Struktur

Mentakrifkan struktur tersuai yang sepadan dengan struktur data JSON membenarkan penugasan terus nilai integer kepada medan integer. Ini menghapuskan keperluan untuk penukaran atau manipulasi data selanjutnya.

Contoh:

import (
    "encoding/json"
    "fmt"
)

type Tag struct {
    Id uint64 `json:"id"`
}

type Data struct {
    Tags []Tag `json:"tags"`
}

body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`)
var data Data
json.Unmarshal(body, &data)

fmt.Println(data.Tags[0].Id) // Logs 4418489049307132905

Awas:

Jika data JSON berasal daripada sumber yang menggunakan JavaScript, perlu diingat bahawa JavaScript hanya menyokong apungan berketepatan ganda IEEE754 nilai dan tidak mempunyai integer 64-bit yang benar. Ini bermakna menghuraikan data JSON sedemikian dalam JavaScript akan mengakibatkan kehilangan ketepatan, tanpa mengira kaedah yang digunakan dalam Go.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Ketepatan Integer 64-Bit 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