Go에서 JSON을 구문 분석할 때 Int64 값 유지
다음 JSON 본문을 고려하세요.
{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
json을 사용할 때 .Unmarshal() Go에서 이 JSON을 처리하려면 64비트 정수 값을 사용하세요. (id)는 Go의 JSON 파서 특성상 float64로 변환되는 경우가 많습니다. 정밀도를 유지해야 하는 경우 문제가 될 수 있습니다.
해결책 1: 맞춤 디코더
한 가지 접근 방식은 맞춤 디코더와 json.Number 유형을 사용하는 것입니다. json.Number는 JSON 숫자 리터럴을 나타내는 유형입니다.
import ( "encoding/json" "fmt" "bytes" "strconv" ) func main() { body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`) dat := make(map[string]interface{}) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() 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: 사용자 정의 구조
또 다른 옵션은 JSON을 다음과 같은 사용자 정의 구조로 디코딩하는 것입니다. 특히 데이터 형식과 일치합니다.
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 }
이 솔루션에서 uint64는 64비트 정수 값이 보존되도록 보장하는 구조입니다.
위 내용은 Go에서 JSON을 언마샬링할 때 Int64 정밀도를 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!