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

转载  2018-01-12   作者:youyu岁月   我要评论

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

前言

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

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

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]

总结

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

相关文章

  • 用Go+Vue.js快速搭建一个Web应用(初级demo)

    用Go+Vue.js快速搭建一个Web应用(初级demo)

    这篇文章主要介绍了用Go+Vue.js快速搭建一个Web应用(初级demo),本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11
  • Go语言中通过Lua脚本操作Redis的方法

    Go语言中通过Lua脚本操作Redis的方法

    这篇文章主要给大家介绍了关于Go语言中通过Lua脚本操作Redis的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • go语言channel实现多核并行化运行的方法

    go语言channel实现多核并行化运行的方法

    这篇文章主要介绍了go语言channel实现多核并行化运行的方法,实例分析了channel实现多核并行化运行的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Go语言写入字符串到文件的方法

    Go语言写入字符串到文件的方法

    这篇文章主要介绍了Go语言写入字符串到文件的方法,实例分析了Go语言操作字符串及文本的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • golang中struct和interface的基础使用教程

    golang中struct和interface的基础使用教程

    Go不同于一般的面向对象语言,需要我们好好的学习研究,下面这篇文章主要给大家介绍了关于golang中struct和interface的基础使用的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-03-03
  • Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法

    Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法

    这篇文章主要介绍了Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法,以实例形式详细分析了几种常见的排序技巧与实现方法,非常具有实用价值,需要的朋友可以参考下
    2015-02-02
  • Golang记录、计算函数执行耗时、运行时间的一个简单方法

    Golang记录、计算函数执行耗时、运行时间的一个简单方法

    这篇文章主要介绍了Golang记录、计算函数执行耗时、运行时间的一个简单方法,本文直接给出代码实例,需要的朋友可以参考下
    2015-07-07
  • Golang学习笔记(一):简介

    Golang学习笔记(一):简介

    这篇文章主要介绍了Golang学习笔记(一):简介,本文讲解了Go语言最主要的特性、安装、环境变量设置、整体目录结构、Helloworld、go命令、调试、编辑器设置等内容,需要的朋友可以参考下
    2015-05-05
  • GO语言运行环境下载、安装、配置图文教程

    GO语言运行环境下载、安装、配置图文教程

    这篇文章主要介绍了GO语言运行环境下载、安装、配置图文教程,需要的朋友可以参考下
    2017-02-02
  • Go语言里的结构体文法实例分析

    Go语言里的结构体文法实例分析

    这篇文章主要介绍了Go语言里的结构体文法,实例分析了结构体文法的概念及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02

最新评论