Files
MyGoNavi/internal/db/json_decode.go
Syngnat e3b142053f 🐛 fix(precision): 修复查询链路与分页统计的大整数精度丢失
- 代理响应数据解码改为 UseNumber,避免默认 float64 吞精度
- 统一归一化 json.Number 与超界整数,超出 JS 安全范围转字符串
- 修复 DataViewer 总数解析,超大值不再误转 Number 参与分页
- refs #142
2026-03-02 14:40:59 +08:00

54 lines
1013 B
Go

package db
import (
"bytes"
"encoding/json"
)
func decodeJSONWithUseNumber(data []byte, out interface{}) error {
if out == nil {
return nil
}
decoder := json.NewDecoder(bytes.NewReader(data))
decoder.UseNumber()
if err := decoder.Decode(out); err != nil {
return err
}
normalizeDecodedJSONNumbers(out)
return nil
}
func normalizeDecodedJSONNumbers(out interface{}) {
switch typed := out.(type) {
case *[]map[string]interface{}:
if typed == nil {
return
}
for i := range *typed {
row := (*typed)[i]
for key, value := range row {
row[key] = normalizeQueryValue(value)
}
}
case *map[string]interface{}:
if typed == nil || *typed == nil {
return
}
for key, value := range *typed {
(*typed)[key] = normalizeQueryValue(value)
}
case *[]interface{}:
if typed == nil {
return
}
for i, item := range *typed {
(*typed)[i] = normalizeQueryValue(item)
}
case *interface{}:
if typed == nil {
return
}
*typed = normalizeQueryValue(*typed)
}
}