使用 Golang 将 JSON 中的整数解析为整数,将浮点数解析为浮点数
在接收 JSON 记录流以转发到的 Golang 应用程序中数据存储(InfluxDB),保留整数和浮点值的原始数据类型以避免类型至关重要冲突并确保成功的写入操作。虽然 Ruby JSON 解析器可以轻松执行此任务,但 Golang 中的encoding/json 包最初将所有数字解析为浮点数,可能导致类型不匹配和写入失败。
使用自定义 JSON 值的解决方法
要复制 Ruby JSON 解析器的行为,一种方法是利用通用 Go 机制来处理自定义 JSON 值。在此方法中,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中文网其他相关文章!