2014-11-25 97 views
1

我有以下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"]) 
} 
+0

某个关键字是否总是具有特定类型? (例如,'sequence'始终是'int64',永远不会是一个字符串或一个浮点数) – ANisus 2014-11-25 15:17:29

+0

是和不是......在特定的流中(为此将运行此代码的一个实例),是的。但是我不知道什么键会在那里,不同的行将有不同的“空间”的子集 - 它们实际上(列名,值)对被馈送到数据库 - 缺少的键是在cassandra中视为无效。 – user3299313 2014-11-25 15:30:37

回答

1

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

+0

不要以为我的顶层是一个列表而不是一个结构,因此它的第二部分工作。但顶级的作品很棒,谢谢! – user3299313 2014-11-25 16:24:54

相关问题