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

例如,我正在使用 golang 对 JSON 进行编组和解组,当我想对数字字段进行处理时,golang 会将其转换为浮点数而不是长数字。


我有以下 JSON:


{

    "id": 12423434, 

    "Name": "Fernando"

}

在marshal它到地图并unmarshal再次到 json 字符串之后,我得到:


{

    "id":1.2423434e+07,

    "Name":"Fernando"

}

如您所见,该"id"字段采用浮点表示法。


我正在使用的代码如下:


package main


import (

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


凤凰求蛊
浏览 254回答 2
2回答

12345678_0001

有时您无法提前定义结构,但仍然需要数字不变地通过 marshal-unmarshal 过程。在这种情况下,您可以使用UseNumberon 方法json.Decoder,这会导致所有数字解组为json.Number(这只是数字的原始字符串表示形式)。这对于在 JSON 中存储非常大的整数也很有用。例如:package mainimport (    "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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go