我正在尝试使用类型在 Go 中创建 JSON 表示形式map[string]interface{}。我正在处理 JSON 字符串,并且很难弄清楚如何避免 JSON 解组器自动将数字处理为 float64。结果出现以下错误。
前任。
"{ 'a' : 9223372036854775807}"应该是map[string]interface{} = [a 9223372036854775807但实际上是这样map[string]interface{} = [a 9.2233720368547758088E18]
我搜索了如何使用结构来避免这种情况,json.Number但我真的更喜欢使用map上面指定的类型。
go函数json.Unmarshal(...)自动使用 float64 作为 JSON 数字。如果您想将数字解组为不同的类型,那么您必须使用自定义类型和自定义解组器。无法强制解组器将自定义值反序列化为通用映射。
例如,以下是如何将“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}
}
Run Code Online (Sandbox Code Playgroud)