> 백엔드 개발 > Golang > 지수가 포함된 숫자 값을 만날 때 Golang JSON이 오류를 비정렬화하는 이유는 무엇입니까?

지수가 포함된 숫자 값을 만날 때 Golang JSON이 오류를 비정렬화하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-15 19:21:02
원래의
745명이 탐색했습니다.

Why Does Golang JSON Unmarshal Error When Encountering Numeric Values with Exponents?

Golang JSON 비정렬 오류: 지수가 포함된 숫자 값이 0을 반환합니다

JSON 데이터를 Go 구조체로 비정렬화하려고 시도하는 동안 사용자가 지수가 포함된 숫자 값이 일관되게 0으로 해석되는 문제. 이 동작은 예상 유형과 실제 값이 일치하지 않기 때문에 발생합니다.

예를 들어 {"id": 1.2e 8과 같은 JSON 문자열이 있는 경우 , "Name": "Fernando"}는 uint64 유형의 ID 필드가 있는 구조체로 역마샬링되며 결과 Id는 0이 됩니다.

해결책

이 문제를 해결하려면 구조체의 필드 유형이 JSON 문자열의 데이터 유형과 일치하는지 확인하세요. 이 경우 지수를 사용하므로 Id 필드를 float32 또는 float64와 같은 부동 소수점 유형으로 정의해야 합니다.

대체 솔루션

예상 유형이 JSON 숫자 형식과 호환되지 않는 경우 해결 방법을 구현할 수 있습니다. 원하는 유형의 "더미" 필드를 추가하면 후크를 사용하여 값을 실제 예상 유형으로 캐스팅할 수 있습니다.

예:

type Person struct {
    Id    float64          `json:"id"`
    _Id   int64             
    Name  string           `json:"name"`
}
로그인 후 복사

JSON 데이터를 정렬 해제한 후 Person 구조체에 조건부 검사를 추가하여 Id 필드를 int64로 변환할 수 있습니다.

var f Person
var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`)
_ = json.Unmarshal(b, &f)

if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) {
    fmt.Println(f.Id)
    f._Id = int64(f.Id)
}
로그인 후 복사

이 해키 접근 방식을 사용하면 부동 소수점 Id 필드를 원하는 int64 유형으로 변환할 수 있습니다.

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

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