• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang中json反序列化可能遇到的问题

    前言

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

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

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

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

    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)
    }

    输出如下结果

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

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

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

    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)
    }

    输出如下结果

    map[id:12423434 Name:Fernando]

    总结

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

    您可能感兴趣的文章:
    • golang的序列化与反序列化的几种方式
    上一篇:golang 40行代码实现通用协程池
    下一篇:浅谈golang的http cookie用法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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