Go:将JSON字符串转换为映射[string]接口{}

Go:将JSON字符串转换为映射[string]接口{},json,go,Json,Go,我试图使用map[string]接口{}类型在Go中创建一个JSON表示。我正在处理JSON字符串,我很难想出如何避免JSON解组器将数字自动处理为浮点数。因此,出现以下错误 前。 “{'a':9223372036854775807}”应该是map[string]interface{}=[a 9223372036854775807但实际上它是map[string]interface{}=[a 9.2233720368547758088E18] 我通过使用json.Number搜索了如何使用结构来

我试图使用
map[string]接口{}
类型在Go中创建一个JSON表示。我正在处理JSON字符串,我很难想出如何避免JSON解组器将数字自动处理为浮点数。因此,出现以下错误

前。
“{'a':9223372036854775807}”
应该是
map[string]interface{}=[a 9223372036854775807
但实际上它是
map[string]interface{}=[a 9.2233720368547758088E18]

我通过使用
json.Number
搜索了如何使用结构来避免这种情况,但我更喜欢使用上面指定的
map
类型。

自动将float64用于json数字。如果您想将数字解组为其他类型,则必须使用带有自定义解组器的自定义类型。没有办法强制解组器将自定义值反序列化到通用映射中

例如,下面是如何将“a”属性的值解析为a


JSON默认对所有数字使用float64:。如果希望它是整数,则需要使用整数值将其解组到目标(例如,
map[string]int
struct{a int}
)。或者接受它将是一个浮点,然后简单地将其类型转换为int。我知道Go的
编码/json
默认为将float64s用于json数字。如果使用大的int64值,类型转换将是最简单的解决方案。我想我必须编写一个自定义封送处理程序或指定映射类型。谢谢
package main

import (
  "encoding/json"
  "fmt"
  "math/big"
)

type MyDoc struct {
  A BigA `json:"a"`
}

type BigA struct{ *big.Int }

func (a BigA) UnmarshalJSON(bs []byte) error {
  _, ok := a.SetString(string(bs), 10)
  if !ok {
    return fmt.Errorf("invalid integer %s", bs)
  }
  return nil
}

func main() {
  jsonstr := `{"a":9223372036854775807}`
  mydoc := MyDoc{A: BigA{new(big.Int)}}

  err := json.Unmarshal([]byte(jsonstr), &mydoc)
  if err != nil {
    panic(err)
  }

  fmt.Printf("OK: mydoc=%#v\n", mydoc)
  // OK: mydoc=main.MyDoc{A:9223372036854775807}
}