在我的 Go 代码中,我正在努力解组我们从端点接收到的 JSON 有效负载。此端点以科学计数法对大值进行编码:type Test struct { Key string Value int32}func main() { data := []byte("{\"Key\": \"derp\", \"Value\": 3.898733e+06}") var t *Test err := json.Unmarshal(data, &t) fmt.Printf("Error: %v\n", err) fmt.Printf("Data: %v\n", t)}此处的编码值相当于标准表示法中的 3,898,733。但是,此代码会打印错误:json:无法将数字 3.898733e+06 解组到 int32 类型的 Go 结构字段 Test.Value这是有道理的,因为strconv也无法从字符串中解析此值。但是,我可以做到var i int32 = 3.898733e+06,并且可以编译并生成正确的答案。那么,我该如何解决这个错误呢?
1 回答

慕慕森
TA贡献1856条经验 获得超17个赞
该声明var i int32 = 3.898733e+06
有效是因为此表达式中的文字是无类型常量,并且无类型常量是根据上下文计算的。在这种情况下,即使它被写为浮点数,它在编译时也被解释为 int32。这不会在运行时发生。
有几个选项可以使它适用于 JSON 封送处理:
声明
Value
为json.Number
。通过这种方式,您可以尝试将其解析为 int64,如果失败,则将其解析为 float64,然后转换为 int64,希望您不会失去精度。定义一个自定义类型并自己解组:
type LongInt int32
func (i *LongInt) UnmarshalJSON(data []byte) error {
// Parse data yourself and set the int value
// Maybe use big.Int?
}
声明Value为float64
- 1 回答
- 0 关注
- 76 浏览
添加回答
举报
0/150
提交
取消