php 反序列化后面有省略号,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]

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值