2013-08-28 140 views
0

我想解碼來自(靜態模式)json文件的一大組數據。該文件僅包含數字數據,並且鍵都是整數。我知道如何使用json.Unmarshal將此json解碼爲包含map[string]intmap[string]float32字段的結構。但我對字符串鍵沒有興趣,我需要以某種方式將它們轉換爲int。json解碼密鑰類型

所以想什麼,我知道的是:

  1. 有沒有辦法實現這個目標,.IE獲取包含地圖的字段的結構[INT] FLOAT32直接從解碼類型,
  2. 否則解碼後如何實現這一點,以一種高效的內存方式?

由於

+0

提示:通過http://jsonlint.com/運行你的json文件,看看它對你的「json」有什麼感覺。 – Crisfole

+1

'結果 有效的JSON.' 我曾經提到過我的json文件有問題嗎? – ybycode

+0

不,但將數字用作json文件中的鍵是無效的,並且會導致大多數json工具自動將它們轉換爲字符串。你可能能夠分解編碼/ json包,並讓它做你想做的事情......但無論如何,我的投票都是在@@ ANisus的(正確的)答案 – Crisfole

回答

6

具有字符串鍵的JSON format僅指定鍵/值的對象。因此,encoding/json軟件包也只支持字符串鍵。

json/encoding文檔狀態:

BOOL,用於JSON布爾
float64,用於JSON數字
字符串,JSON字符串
[]接口{},對於JSON陣列
地圖[串] interface {},用於JSON對象
無JSON null

如果你想使用encoding/json包並將其移動到地圖[INT] float64,你可以做以下(含FLOAT32工作以及):

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    a := map[string]float64{"1":1, "2":4, "3":9, "5":25} 
    b := make(map[int]float64, len(a)) 

    for k,v := range a { 
     if i, err := strconv.Atoi(k); err == nil { 
      b[i] = v 
     } else { 
      // A non integer key 
     } 
    } 

    fmt.Printf("%#v\n", b) 
} 

Playground

0

encoding/json包包括一個接口Unmarshaler其中有一個方法:UnmarshalJSON(data []byte) error

如果你感覺勇敢,你可以實施,對於以下:

type IntToFloat map[int]float32 

func (itf *IntToFloat) UnmarshalJSON(data []byte) error { 
    if itf == nil { 
     return errors.New("Unmarshalling JSON for a null IntToFload") 
    } 
    // MAGIC Goes here. 
    return nil 
} 

編輯

注:http://golang.org/src/pkg/encoding/json/decode.go?s=2221:2269#L53就是解組的性病庫版本從何而來。

http://golang.org/pkg/encoding/json/#Unmarshaler是上面引用的接口來自何處。

+1

感謝您的回答!我不確定我現在是否熟練地使用這個解決方案,儘管^^ – ybycode