mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-10 17:43:15 +08:00
- 代理响应数据解码改为 UseNumber,避免默认 float64 吞精度 - 统一归一化 json.Number 与超界整数,超出 JS 安全范围转字符串 - 修复 DataViewer 总数解析,超大值不再误转 Number 参与分页 - refs #142
54 lines
1013 B
Go
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)
|
|
}
|
|
}
|