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

带有长数字的 JSON 解组给出浮点数

带有长数字的 JSON 解组给出浮点数

Go
凤凰求蛊 2021-07-27 17:57:28
例如,我正在使用 golang 对 JSON 进行编组和解组,当我想对数字字段进行处理时,golang 会将其转换为浮点数而不是长数字。我有以下 JSON:{    "id": 12423434,     "Name": "Fernando"}在marshal它到地图并unmarshal再次到 json 字符串之后,我得到:{    "id":1.2423434e+07,    "Name":"Fernando"}如您所见,该"id"字段采用浮点表示法。我正在使用的代码如下:package mainimport (    "encoding/json"    "fmt"    "os")func main() {    //Create the Json string    var b = []byte(`        {        "id": 12423434,         "Name": "Fernando"        }    `)    //Marshal the json to a map    var f interface{}    json.Unmarshal(b, &f)    m := f.(map[string]interface{})    //print the map    fmt.Println(m)    //unmarshal the map to json    result,_:= json.Marshal(m)    //print the json    os.Stdout.Write(result)}它打印:map[id:1.2423434e+07 Name:Fernando]{"Name":"Fernando","id":1.2423434e+07}似乎是marshal地图的第一个生成 FP。我怎样才能把它修好?这是goland playground中程序的链接:http ://play.golang.org/p/RRJ6uU4Uw-
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

有时您无法提前定义结构,但仍然需要数字不变地通过 marshal-unmarshal 过程。


在这种情况下,您可以使用UseNumberon 方法json.Decoder,这会导致所有数字解组为json.Number(这只是数字的原始字符串表示形式)。这对于在 JSON 中存储非常大的整数也很有用。


例如:


package main


import (

    "strings"

    "encoding/json"

    "fmt"

    "log"

)


var data = `{

    "id": 12423434, 

    "Name": "Fernando"

}`


func main() {

    d := json.NewDecoder(strings.NewReader(data))

    d.UseNumber()

    var x interface{}

    if err := d.Decode(&x); err != nil {

        log.Fatal(err)

    }

    fmt.Printf("decoded to %#v\n", x)

    result, err := json.Marshal(x)

    if err != nil {

        log.Fatal(err)

    }

    fmt.Printf("encoded to %s\n", result)

}

结果:


decoded to map[string]interface {}{"id":"12423434", "Name":"Fernando"}

encoded to {"Name":"Fernando","id":12423434}


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

添加回答

举报

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