gpt4 book ai didi

golang中json反序列化可能遇到的问题

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 38 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章golang中json反序列化可能遇到的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了) 。

?
1
2
3
var val float64
val = 1000000
fmt.Println(val) // ==> 1e+06

而在日常开发中,我们经常遇到这样一个问题,就是要反序列化前端传递来的json,因为数据结构未知,所以我们便会使用map[string]interface{}来接收反序列化的结果。由于golang将json解析到interface{}类型的时候,遵循如下规则 。

  • bool 代表 JSON booleans,
  • float64 代表 JSON numbers,
  • string 代表 JSON strings,
  • nil 代表 JSON null.

所以如果我们接收到的json中存在一个比较大的数字,那么它就会被解析成float64类型的,并且有可能显示为科学计数法的形式,比如下面这个例子 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import (
  "encoding/json"
  "fmt"
)
 
func main() {
  //Create the Json string
  var data = `
  {
  "id": 12423434,
  "Name": "Fernando"
  }
  `
 
  //Marshal the json to a map
  var result map[string]interface{}
  err := json.Unmarshal([]byte(data), &result)
  if err != nil {
  fmt.Println(err.Error())
  return
  }
  fmt.Println(result)
}

输出如下结果 。

?
1
map[id:1.2423434e+07 Name:Fernando]

这个时候如果把它传递给前端使用的话,那么前端是有可能会报错的。所以我们最好还是保持这个数字的原始字符串表现形式。即使用json.Number类型来表示 。

所以换成如下代码就可以了 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main
import (
  "encoding/json"
  "fmt"
  "strings"
)
 
func main() {
  //Create the Json string
  var data = `
  {
  "id": 12423434,
  "Name": "Fernando"
  }
  `
  //Marshal the json to a map
  var result map[string]interface{}
  d := json.NewDecoder(strings.NewReader(data))
  d.UseNumber()
  err := d.Decode(&result)
  if err != nil {
  fmt.Println(err.Error())
  return
  }
  // 此刻result["id"]的类型就是json.Number了 它的底层类型其实就是string
  fmt.Println(result)
}

输出如下结果 。

?
1
map[id:12423434 Name:Fernando]

总结 。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.

原文链接:http://www.itzh.org/2017/12/27/golang_json_unmarshal_problem/ 。

最后此篇关于golang中json反序列化可能遇到的问题的文章就讲到这里了,如果你想了解更多关于golang中json反序列化可能遇到的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com