2014-11-25 90 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

相關問題