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

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

Mary-Kate Olsen
풀어 주다: 2024-12-08 07:32:27
원래의
216명이 탐색했습니다.

How to Preserve Int64 Precision When Parsing JSON in Go?

Go에서 JSON을 구문 분석할 때 Int64 값 유지

Go에서 JSON 데이터를 구문 분석할 때 json.Unmarshal 함수는 종종 큰 정수 값을 다음으로 변환합니다. 유지 관리에 문제가 될 수 있는 float64 유형 정밀도.

해결책 1:

원래 int64 값을 유지하려면 디코더와 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
}
로그인 후 복사

해결책 2:

또는 사용자 정의 데이터 구조로 직접 디코딩할 수 있습니다.

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
}
로그인 후 복사

주의:

JavaScript의 번호에 유의하세요. 유형은 IEEE754 배정밀도 부동 소수점입니다. 이는 손실 없이 64비트 정수를 표현할 수 없음을 의미합니다. 정밀합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿