虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > GO语言 > golang中json反序列化可能遇到的问题

golang中json反序列化可能遇到的问题
类别:GO语言   作者:码皇   来源:互联网   点击:

这篇文章主要给大家介绍了关于golang中json反序列化可能遇到的问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

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

    var val float64val = 1000000fmt.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类型的,并且有可能显示为科学计数法的形式,比如下面这个例子

    package mainimport ( "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)}

输出如下结果

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

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

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

    package mainimport ( "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)}

输出如下结果

    map[id:12423434 Name:Fernando]

总结

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

您可能感兴趣的文章:

  • Golang中使用JSON的一些小技巧分享
  • 利用Golang解析json数据的方法示例
  • golang实现sql结果集以json格式输出的方法
  • Golang map如何生成有序的json数据详解
  • golang json性能分析详解
相关热词搜索: golang json 序列化 golang json 反序列化