我正在使用golang来封送一个解密的JSONs,而当我想用数字字段进行编码时,golang以浮点数字转换,而不是使用长数字。
我有以下Json:
{ "id": 12423434,"Name": "Fernando" }
在将它组织到一个地图上,然后再将其解组成一个json字符串,我得到:
{ "id":1.2423434e+07,"Name":"Fernando" }
您可以看到“名称”字段是浮点符号。
我使用的代码如下:
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) }
打印:
地图[id:1.2423434e 07名称:Fernando]
{“Name”:“Fernando”,“id”:1.2423434e 07}
这是goland游乐场中的节目的链接:
http://play.golang.org/p/RRJ6uU4Uw-
费尔
有时你不能提前定义一个结构体,但仍然要求数字通过元数据组合进程不变。
在这种情况下,您可以使用Json.Decoder上的UseNumber方法,这将使所有数字解组为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}