>백엔드 개발 >Golang >Go에서 JSON을 구문 분석할 때 64비트 정수 정밀도를 유지하는 방법은 무엇입니까?

Go에서 JSON을 구문 분석할 때 64비트 정수 정밀도를 유지하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-09 11:31:16978검색

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

Go에서 JSON 구문 분석 중 64비트 정수 값 보존

Go에서 64비트 정수 값이 포함된 JSON 데이터를 구문 분석하면 다음과 같은 결과가 발생할 수 있습니다. float64 값으로 변환되어 정밀도가 손실됩니다. 이 문서에서는 JSON 구문 분석 중에 원래 정수 값을 보존하기 위한 두 가지 솔루션을 제시하여 이 문제를 해결합니다.

해결책 1: Decoder 및 UseNumber 사용

Decoder 유형의 UseNumber 사용 메서드를 사용하면 숫자 값을 float64 값 대신 json.Number 개체로 처리하도록 디코더에 지시할 수 있습니다. json.Number는 각각 ParseUint 또는 ParseInt 함수를 사용하여 uint64 또는 int64 유형으로 쉽게 변환할 수 있습니다.

예:

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

해결책 2: 사용자 정의로 디코딩 구조

JSON 데이터의 구조와 일치하는 사용자 정의 구조를 정의하면 정수 값을 정수 필드에 직접 할당할 수 있습니다. 이렇게 하면 데이터를 추가로 변환하거나 조작할 필요가 없습니다.

예:

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

주의:

JSON 데이터가 JavaScript를 사용하는 소스에서 가져온 경우 JavaScript는 IEEE754 배정밀도만 지원한다는 점에 유의할 필요가 있습니다. 부동 소수점 값이 있고 실제 64비트 정수가 부족합니다. 즉, JavaScript에서 JSON 데이터를 구문 분석하면 Go에서 사용되는 방법에 관계없이 정밀도가 손실됩니다.

위 내용은 Go에서 JSON을 구문 분석할 때 64비트 정수 정밀도를 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.