go:如何json.Marshal map [int] int?

时间:2015-11-27 21:47:12

标签: json go marshalling

我知道,Json不支持键的字符串以外的任何东西。

但是将整个map[int]int转换为临时map[string]int并不总是可行的,因为第二个不适合记忆。

有没有一种方法可以动态转换int键?

是否有类似json的格式与int键? YAML?一些二进制格式?

2 个答案:

答案 0 :(得分:1)

不,你无法动态转换地图。您将需要拥有原始地图,直到您填充新地图(然后可以将其删除)。

你要问自己的第一个问题:你要用json做什么,因为现代电脑有很多内存,所以存储4gb也不会有问题(我非常怀疑你是否会发送4gb json请求)。

一旦你知道为什么要编码你的东西,你就可以寻找合适的格式。

例如,您可以序列化地图。

Go Playground

package main

import (
    "fmt"
    "encoding/gob"
    "bytes"
)

var m = map[int]string{1:"one", 2: "two", 3: "three"}

func main() {
    buf := new(bytes.Buffer)
    encoder := gob.NewEncoder(buf)

    err := encoder.Encode(m)
    if err != nil {
        panic(err)
    }

// your encoded stuff
fmt.Println(buf.Bytes())

    var decodedMap map[int]string
    decoder := gob.NewDecoder(buf)

    err = decoder.Decode(&decodedMap)
    if err != nil {
        panic(err)
    }

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

答案 1 :(得分:0)

在代码中进行编码。它很容易,并且可能会更快作为奖金。

这应该有效:

var buf bytes.Buffer
first := true
fmt.Fprint(&buf, "{")
for k, v := range m {
    if first {
        first = false
    } else {
        fmt.Fprint(&buf, ",")
    }
    fmt.Fprintf(&buf, `"%d":%d`, k, v)
}
fmt.Fprint(&buf, "}")

如果您需要将其传递给encoding/json,则可以使用json.RawMessage(buf.Bytes())