json解码密钥类型

时间:2013-08-28 12:55:50

标签: json go

我想从(静态模式)json文件中解码大量数据。该文件仅包含数字数据,键都是整数。我知道如何使用json.Unmarshal将此json解码为包含map[string]intmap[string]float32字段的结构。但我对字符串键没兴趣,我需要以某种方式将它们转换为int。

所以我想知道的是:

  1. 有没有办法实现这一点,.ie直接从解码中获取包含map [int] float32类型字段的结构,
  2. 否则如何在解码后以内存高效的方式实现此目的?
  3. 由于

2 个答案:

答案 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)
}

Playground

答案 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是上面引用的接口来自的地方。