为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
临摹微笑 2021-11-22 20:03:01
我知道,Json 不支持除键字符串之外的任何其他内容。但是将整个转换map[int]int为临时map[string]int并不总是可能的,因为第二个不适合内存。有没有一种方法可以即时转换 int 键?是否有带有 int 键的类似 json 的格式?雅姆?某种二进制格式?
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

不,您不能即时转换地图。在填充新地图之前,您需要拥有原始地图(然后可以将其删除)。


你必须问自己的第一个问题:你打算用那个 json 做什么,因为现代计算机有很多 RAM,所以即使存储 4gb 也不成问题(我非常怀疑你会发送 4gb json 请求) .


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


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


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)

}


查看完整回答
反对 回复 2021-11-22
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

在代码中进行编码。这很容易,而且作为奖励可能会更快。


这应该有效:


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()).


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信