广告
返回顶部
首页 > 资讯 > 后端开发 > GO >浅谈golang的json.Unmarshal的坑
  • 585
分享到

浅谈golang的json.Unmarshal的坑

golangjson.Unmarshal 2023-01-05 09:01:26 585人浏览 泡泡鱼
摘要

最近在golang业务开发时,遇到一个坑。 我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象

最近在golang业务开发时,遇到一个坑。

我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象。

但是因为我的字符串里有一个数字,比如下面demo里的{"number":1234567},而且数字是7位数,在经过JSON.Unmarshal后,被转成了科学计数法的形式,导致私信发出的链接出现异常,结果报错了。

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   jsonStr := `{"number":1234567}`
   result := make(map[string]interface{})
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(result) // map[number:1.234567e+06]

}

数据结构未知,使用 map[string]interface{} 来接收反序列化结果时,如果数字的位数大于 6 位,都会变成科学计数法,用到的地方都会受到影响。

encoding/json包中,可以找到下面一段注释:

//
// To unmarshal JSON into an interface value,
// Unmarshal stores one of these in the interface value:
//
// bool, for JSON booleans
// float64, for JSON numbers
// string, for JSON strings
// []interface{}, for JSON arrays
// map[string]interface{}, for JSON objects
// nil for JSON null
//

对于数字来说,会被解析成 float64 类型,就有可能会出现科学计数法的形式。

问题解决方案1:强制类型转换

func main() {
   jsonStr := `{"number":1234567}`
   result := make(map[string]interface{})
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(int(result["number"].(float64)))

   // 输出
   // 1234567
}

问题解决方案2:尽量避免使用 interface,对 json 字符串结构定义结构体

func main() {
   type Num struct {
      Number int `json:"number"`
   }

   jsonStr := `{"number":1234567}`
   var result Num
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(result)

   // 输出
   // {1234567}
}

参考文档:https://www.jb51.net/article/190537.htm

到此这篇关于浅谈Golang的json.Unmarshal的坑的文章就介绍到这了,更多相关golang json.Unmarshal内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 浅谈golang的json.Unmarshal的坑

本文链接: https://www.lsjlt.com/news/176768.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈golang的json.Unmarshal的坑
    最近在golang业务开发时,遇到一个坑。 我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象...
    99+
    2023-01-05
    golang json.Unmarshal
  • 浅谈golang fasthttp踩坑经验
    一个简单的系统,结构如下: 我们的服务A接受外部的http请求,然后通过golang的fasthttp将请求转发给服务B,流程非常简单。线上运行一段时间之后,发现服务B完全不再接收...
    99+
    2022-11-12
  • 浅谈react useEffect闭包的坑
    问题代码 看一段因为useEffect导致的闭包问题代码 const btn = useRef(); const [v, setV] = useState(''); use...
    99+
    2022-11-12
  • 浅谈MultipartFile中transferTo方法的坑
    前言:最近用SpringBoot写文件上传功能,使用参数绑定之后确实是非常的方便了。 但是,项目部署就出现了问题,搞得我一脸懵逼。 后来,才发现是因为我使用了相对路径导致的,这个绝对...
    99+
    2022-11-12
  • 浅谈Vue+AntDesignform表单的一些坑
    目录设置默认值的坑自定义 v-decorator 组件的坑最近在用 vue + ant 写项目发现 from 组件的坑还是比较多的 设置默认值的坑 控制台报 Warning: You...
    99+
    2022-11-13
  • 浅谈Mybatis+mysql 存储Date类型的坑
    场景: 把一个时间字符串转成Date,存进Mysql。时间天数会比实际时间少1天,也可能是小时少了13-14小时 Mysql的时区是CST(使用语句:show VARIABLES LIKE '%time_zone%'...
    99+
    2022-05-25
    Mybatis mysql 存储Date类型
  • 浅谈pytorch中stack和cat的及to_tensor的坑
    初入计算机视觉遇到的一些坑 1.pytorch中转tensor x=np.random.randint(10,100,(10,10,10)) x=TF.to_tensor(x) ...
    99+
    2022-11-12
  • 浅谈log4j的rootLogger及其他坑爹的地方
    目录log4j的rootLogger及其他坑爹地方经过试验发现!!!!对于申明appender的包rootLogger的级别设置不起作用log4j rootLogger配置log4j...
    99+
    2022-11-12
  • 浅谈Springboot下引入mybatis遇到的坑点
    一、 springBoot + Mybatis 配置完成后,访问数据库遇到的问题 首先出现这个问题,肯定是xml文件与mapper接口没有匹配上,甚至是xml文件根本没有被扫描到。...
    99+
    2022-11-12
  • 浅谈Pytorch中autograd的若干(踩坑)总结
    关于Variable和Tensor 旧版本的Pytorch中,Variable是对Tensor的一个封装;在Pytorch大于v0.4的版本后,Varible和Tensor合并了,意...
    99+
    2022-11-12
  • 浅谈vue-cli5关于yarn的一个小坑
    目录问题解决方案原因问题 昨天有小伙伴下了我的 DEMO之后反映运行报错。 因为这个项目环境我测试过许多次,不管是npm还是yarn都能正常运行,所以听到运行报错时下意识地就认为是...
    99+
    2022-11-13
  • 浅谈golang 中time.After释放的问题
    在谢大群里看到有同学在讨论time.After泄漏的问题,就算时间到了也不会释放,瞬间就惊呆了,忍不住做了试验,结果发现应该没有这么的恐怖的,是有泄漏的风险不过不算是泄漏, 先看AP...
    99+
    2022-11-12
  • 浅谈golang 的高效编码细节
    目录struct 和 map 用谁呢?字符串如何拼接是好?用 + 的方式使用 fmt.Sprintf() 的方式使用 strings.Join 的方式使用 buffer 的方式xdm...
    99+
    2022-11-12
  • 浅谈Golang 嵌套 interface 的赋值问题
    大家还是直接看代码吧~ package main import ( "fmt" ) func main() { s := map[string]inter...
    99+
    2022-11-12
  • 浅谈Golang的new与make区别是什么
    目录newmake小结:区别:在go语言中,make和new都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分...
    99+
    2022-11-13
  • 浅谈Keras中fit()和fit_generator()的区别及其参数的坑
    1、fit和fit_generator的区别 首先Keras中的fit()函数传入的x_train和y_train是被完整的加载进内存的,当然用起来很方便,但是如果我们数据量很大,那...
    99+
    2022-11-12
  • 浅谈Golang 切片(slice)扩容机制的原理
    我们知道 Golang 切片(slice) 在容量不足的情况下会进行扩容,扩容的原理是怎样的呢?是不是每次扩一倍?下面我们结合源码来告诉你答案。 一、源码 Version : go...
    99+
    2022-11-12
  • 浅谈Golang Slice切片如何扩容的实现
    目录一、Slice数据结构是什么?二、详细代码1.数据结构2.扩容原则3.如何理解扩容规则一1.当小于1024个元素时2.当大于1024个元素时4.如何理解扩容规则二1.简单理解内存...
    99+
    2022-11-13
  • 浅谈StringBuilder类的capacity()方法和length()方法的一些小坑
    今天在做项目的过程中遇见一个StringBuilder.delete()删除得不到自己期望结果问题,一个截取字符串的问题,总得不到自己所期望的答案: 问题如下: stringBu...
    99+
    2022-11-12
  • 浅谈MyBatis原生批量插入的坑与解决方案
    目录原生批量插入的“坑”解决方案分片 Demo 实战原生批量插入分片实现总结前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入、MyBatis Plus 批量插...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作