我有以下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