为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不默认为 float64 的情况下解组各种类型的列表

如何在不默认为 float64 的情况下解组各种类型的列表

Go
元芳怎么了 2021-08-30 22:32:25
我有以下 json 数据(来自外部程序,稍微简化了一点)我无法更改 json 格式。[1416495600501595942, {"venue_id": 73, "message_type": "ABC", "sequence": 26686695}]我在 Go 中解压它时遇到问题,我认为主要是因为它是一个不同类型的列表。显而易见的事情似乎是 []interface{},它有效,但在将其转换为 float64 时,会产生一个我无法处理的舍入错误(该数字是自 nanos 纪元以来的时间戳) )。我可以通过将其解压缩两次来使其工作,如 []interface{} 和 []int64,但这显然会影响性能,而且我正在实时处理大量数据。我在这里尝试使用 struct ,因为它会被视为地图,而不是列表 []有什么方法可以将数据的格式传递给它,或者使其默认为 int64 而不是 float64?它总是会[int64, map[string]interface{}]即我知道上层列表的格式,并且地图的键是字符串,但值可以是任何东西(痛苦的是,包括小数,我认为我唯一可以用来将它们解释为浮点数的东西.. .)package mainimport (    "encoding/json"    "fmt")func main() {    j := `[1416495600501595942, {"venue_id": 73, "message_type": "ABC", "sequence": 26686695}]`    b := []byte(j)    fmt.Println(j)    var line []interface{}    var ints []int64    json.Unmarshal(b, &line)    fmt.Println(line)    // fmt.Println(line[0].(int64))  - this doesn't work    fmt.Println(line[0].(float64))    fmt.Println(int64(line[0].(float64)))    json.Unmarshal(b, &ints)    fmt.Println(ints)}输出如下:[1416495600501595942,{“venue_id”:73,“message_type”:“oKC”,“sequence”:26686695}][1.416495600501596e+18 地图[venue_id:73 message_type:oKC 序列:2.6686695e+07]]1.416495600501596e+181416495600501595904[1416495600501595942 0]解决方案(感谢 makpoc/dystroy)package mainimport (    "encoding/json"    "fmt"    "bytes")func main() {    j := `[1416495600501595942, {"venue_id": 7.3, "message_type": "oKC", "sequence": 26686695}]`    b := []byte(j)    fmt.Println(j)    var line []interface{}    d := json.NewDecoder(bytes.NewBuffer(b))    d.UseNumber()        if err := d.Decode(&line); err != nil {        panic(err)    }    fmt.Println(line[0])    data := line[1].(map[string]interface{})    fmt.Println(data["venue_id"])    fmt.Println(data["sequence"])}
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您可以使用 Decoder -> 和 UseNumber 或结构,而不是直接解析值。


查看完整回答
反对 回复 2021-08-30
  • 1 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信