Go:将JSON字符串转换为map [string] interface {}

时间:2017-11-20 20:19:50

标签: json go

我正在尝试使用map[string]interface{}类型在Go中创建JSON表示。我正在处理JSON字符串,我很难弄清楚如何避免JSON解组器自动处理数字为float64s。结果发生以下错误。

实施例。 "{ 'a' : 9223372036854775807}"应为map[string]interface{} = [a 9223372036854775807,但实际上为map[string]interface{} = [a 9.2233720368547758088E18]

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

1 个答案:

答案 0 :(得分:2)

go json.Unmarshal(...) function自动将float64用于JSON号码。如果要将数字解组为其他类型,则必须使用具有自定义解组的自定义类型。无法强制unmarshaler将自定义值反序列化为通用映射。

例如,在这里,您可以解析" a"的值。属性为big.Int

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}
}