JSON 구문 분석에서 데이터 유형 보존: 정수를 정수로, 부동 소수점을 부동 소수점으로
Golang에서 정수 혼합이 포함된 JSON 레코드 구문 분석 부동 소수점 값은 원래 데이터 유형을 유지하기 위해 신중하게 처리해야 합니다. 그러나 인코딩/json 패키지를 사용하는 현재 구현은 모든 숫자를 부동 소수점으로 구문 분석하므로 잠재적으로 데이터 저장소에서 유형 충돌이 발생할 수 있습니다.
이 문제를 해결하려면 다음과 같은 몇 가지 접근 방식을 사용할 수 있습니다.
1. 사용자 정의 JSON 값 처리:
사용자 정의 JSON 값에 대한 Go 메커니즘을 활용하여 정수 및 부동 소수점을 적절하게 식별하고 처리할 수 있습니다.
package main import ( "encoding/json" "fmt" "strconv" ) func main() { str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}` var raw map[string]json.RawMessage err := json.Unmarshal([]byte(str), &raw) if err != nil { panic(err) } parsed := make(map[string]interface{}, len(raw)) for key, val := range raw { s := string(val) i, err := strconv.ParseInt(s, 10, 64) if err == nil { parsed[key] = i continue } f, err := strconv.ParseFloat(s, 64) if err == nil { parsed[key] = f continue } var v interface{} err = json.Unmarshal(val, &v) if err == nil { parsed[key] = v continue } parsed[key] = val } for key, val := range parsed { fmt.Printf("%T: %v %v\n", val, key, val) } }
2. json.Number 유형:
Go는 JSON 숫자 처리를 위해 특별히 설계된 json.Number 유형을 제공합니다. 이를 통해 숫자를 부동 소수점으로 구문 분석한 다음 필요에 따라 정수 또는 부동 소수점을 추출할 수 있습니다.
package main import ( "encoding/json" "fmt" "strings" ) func main() { str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}` var parsed map[string]interface{} d := json.NewDecoder(strings.NewReader(str)) d.UseNumber() err := d.Decode(&parsed) if err != nil { panic(err) } for key, val := range parsed { n, ok := val.(json.Number) if !ok { continue } if i, err := n.Int64(); err == nil { parsed[key] = i continue } if f, err := n.Float64(); err == nil { parsed[key] = f continue } } for key, val := range parsed { fmt.Printf("%T: %v %v\n", val, key, val) } }
이러한 접근 방식은 JSON에서 정수 및 부동 소수점 값을 구문 분석하고 보존하는 유연한 방법을 제공하여 후속 처리에서 올바른 데이터 표현을 보장합니다.
위 내용은 Go에서 JSON을 구문 분석할 때 정수 및 부동 소수점 데이터 유형을 어떻게 보존할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!