我有以下json数据(来自外部程序,简化了一下) 我无法更改json格式。如何Unmarshal不同类型的列表没有默认为float64
[1416495600501595942, {"venue_id": 73, "message_type": "ABC", "sequence": 26686695}]
我在打开Go时遇到了麻烦,我想主要是因为它是一个不同类型的列表。 似乎要做的显而易见的事情是[] interface {},它可以工作,但是将其转换为float64,这会产生一个我无法处理的舍入错误(该数字是自epoch in以来的时间戳毫微秒)。
我可以使用[] interface []和[] int64]将它解包两次,但这显然会妨碍性能,并且我正在实时处理大量数据。 我尝试在这里使用结构,因为这将被视为一个地图,而不是一个列表[]
有没有办法将它传递给数据的格式,或使其默认为int64而不是float64?它总是要
[int64, map[string]interface{}]
即我知道上级列表格式,以及映射的键是字符串,但是值可以是任何东西(痛苦,包括小数,我认为唯一的
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"])
}
某个关键字是否总是具有特定类型? (例如,'sequence'始终是'int64',永远不会是一个字符串或一个浮点数) – ANisus 2014-11-25 15:17:29
是和不是......在特定的流中(为此将运行此代码的一个实例),是的。但是我不知道什么键会在那里,不同的行将有不同的“空间”的子集 - 它们实际上(列名,值)对被馈送到数据库 - 缺少的键是在cassandra中视为无效。 – user3299313 2014-11-25 15:30:37