>백엔드 개발 >Golang >Go에서 지수가 포함된 JSON 숫자 값을 비정렬화하는 방법은 무엇입니까?

Go에서 지수가 포함된 JSON 숫자 값을 비정렬화하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-15 13:59:03259검색

How to Unmarshal JSON Numeric Values with Exponents in Go?

지수가 있는 숫자 값의 JSON 역정렬화

Golang 사용자는 JSON 문자열을 지수가 있는 숫자 값이 포함된 Go 구조로 역정렬화하려고 할 때 어려움을 겪을 수 있습니다. . 기본적으로 Go는 이러한 값을 잘못 해석하여 정밀도가 떨어집니다.

문제 데모

다음 Go 코드를 고려하세요.

type Person struct {
    Id   uint64  `json:"id"`
    Name string `json:"name"`
}

func parseJSON(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    // The numeric value with an exponent is lost.
    fmt.Println(person.Id)
}

{ "id": 1.2E 8, "name": "John" }과 같은 JSON 문자열을 입력으로 제공하면,parseJSON 함수는 지수가 무시됨을 나타내는 0을 인쇄합니다.

해결 방법

이 문제를 해결하려면 아래 설명과 같이 Id 필드 유형을 float64와 같은 부동 소수점 유형으로 조정하세요.

type Person struct {
    Id   float64 `json:"id"`
    Name string `json:"name"`
}

이 수정을 통해 Go to 지수를 올바르게 해석하고 숫자 값을 보존합니다.

후크를 사용한 대체 접근 방식

필드 유형을 변경할 수 없는 경우 다음과 관련된 해결 방법을 사용할 수 있습니다. "더미" 필드 및 사용자 정의 후크. 이 후크는 "더미" 필드의 값을 원하는 정수 유형으로 변환합니다.

type Person struct {
    Id    float64          `json:"id"`
    _Id   int64             
    Name  string           `json:"name"`
}

func parseJSONWithHook(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    if reflect.TypeOf(person._Id) == reflect.TypeOf((int64)(0)) {
        person._Id = int64(person.Id)
    }
}

두 가지 접근 방식 중 하나를 따르면 Go 프로그램에서 지수가 포함된 숫자 값을 성공적으로 처리할 수 있습니다.

위 내용은 Go에서 지수가 포함된 JSON 숫자 값을 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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