我想从(静态模式)json文件中解码大量数据。该文件仅包含数字数据,键都是整数。我知道如何使用json.Unmarshal将此json解码为包含map[string]int
或map[string]float32
字段的结构。但我对字符串键没兴趣,我需要以某种方式将它们转换为int。
所以我想知道的是:
由于
答案 0 :(得分:6)
JSON format仅指定带有字符串键的键/值对象。因此,encoding/json
包仅支持字符串键。
json/encoding
文档声明:
布尔,对于JSON布尔人来说 float64,用于JSON号码 字符串,用于JSON字符串
[] interface {},用于JSON数组
map [string] interface {},用于JSON对象
n为JSON null
如果你想使用encoding/json
包并将其移动到map [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)
}
答案 1 :(得分: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是Unmarshal的std库版本来自的地方。
http://golang.org/pkg/encoding/json/#Unmarshaler是上面引用的接口来自的地方。