首页 文章

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

提问于
浏览
1

我有以下json数据(来自外部程序,简化了一点)我无法改变json格式 .

[1416495600501595942, {"venue_id": 73, "message_type": "ABC", "sequence": 26686695}]

我在Go中解压缩时遇到了麻烦,我认为主要是因为它是一个不同类型的列表 . 显而易见的事情似乎是做[] interface {},它可以工作,但是将其转换为float64,这会产生我无法处理的舍入错误(该数字是自nanoch epoch以来的时间戳) ) .

我可以通过解压缩两次来实现它,如[] interface {}和[] int64,但这显然会阻碍性能,而且我正在实时处理大量数据 . 我尝试在这里使用struct,因为它会被视为 Map ,而不是列表[]

有没有办法要么传递数据格式,要么默认为int64而不是float64?它总是会的

[int64, map[string]interface{}]

即我知道上层列表的格式,并且 Map 的键是字符串,但值可以是任何东西(痛苦,包括小数,我认为我唯一能用它来解释它们是浮点数... . )

package main

import (
    "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 map[venue_id:73 message_type:oKC sequence:2.6686695e+07]]
1.416495600501596e+18
1416495600501595904
[1416495600501595942 0]

解决方案(感谢makpoc / dystroy)

package main

import (
    "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 回答

  • 1

    根据this answer,您可以使用Decoder - >和UseNumber或结构而不是直接解析值 .

相关问题