Golang을 사용하여 JSON에서 정수를 정수로, 부동 소수점을 부동 소수점으로 구문 분석
다음으로 전달할 JSON 레코드 스트림을 수신하는 Golang 애플리케이션 데이터 저장소(InfluxDB)에서는 유형 충돌을 피하기 위해 정수 및 부동 소수점 값의 원래 데이터 유형을 유지하는 것이 중요합니다. 성공적인 쓰기 작업을 보장합니다. Ruby JSON 파서가 이 작업을 쉽게 수행하는 동안 Golang의 인코딩/json 패키지는 처음에 모든 숫자를 부동 소수점으로 구문 분석하므로 잠재적으로 유형 불일치 및 쓰기 오류가 발생할 수 있습니다.
사용자 정의 JSON 값을 사용한 해결 방법
Ruby JSON 파서의 동작을 복제하기 위한 한 가지 접근 방식은 사용자 정의 JSON 값에 대한 일반 Go 메커니즘을 활용하는 것입니다. 이 방법에서는 JSON 숫자를 바이트 배열(json.RawMessage)로 표현하고 strconv.ParseInt 및 strconv.ParseFloat를 사용하여 구문 분석합니다. 이를 통해 정수 및 부동 소수점의 정확한 변환이 가능합니다.
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) } }
출력:
int64: a 123 float64: b 12.3 string: c 123 string: d 12.3 bool: e true
json.Number 유형 사용
대체 접근 방식은 Go json.Number 유형을 사용하는 것입니다. JSON 데이터에서 정수와 부동 소수점을 직접 구문 분석:
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) } }
출력:
int64: a 123 float64: b 12.3 string: c 123 string: d 12.3 bool: e true
이러한 방법은 원본 데이터 유형을 보존하기 위한 효과적인 솔루션을 제공합니다. Golang에서 JSON을 구문 분석하는 동안 정수 및 부동 소수점을 사용하여 정확하고 안정적인 데이터 처리를 보장합니다.
위 내용은 Golang의 JSON에서 정수와 부동 소수점을 어떻게 정확하게 구문 분석할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!