首页 > 其他分享 >Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型

Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型

时间:2023-08-03 20:00:10浏览次数:30  
标签:数字 err float64 json number Golang JSON result interface

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

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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包中,可以找到下面一段注释:

1 2 3 4 5 6 7 8 9 10 11 // // 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:强制类型转换

1 2 3 4 5 6 7 8 9 10 11 12 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 字符串结构定义结构体

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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} }

标签:数字,err,float64,json,number,Golang,JSON,result,interface
From: https://www.cnblogs.com/matengfei123/p/17604309.html

相关文章

  • java输出字符和数字
    1、用java如何输出一个字符串中的所有数字?2、使用java语言编写程序,统计从控制台输入的一行字符串中数字个数、字母...3、java中怎么将字符串中的数字取出来4、JAVA怎样快速把字符串里面的数字取出来用java如何输出一个字符串中的所有数字?数字的ascii码是48-57共10个。......
  • VScode 中golang 基准测试 go test -bench .
    目的:基准测试的主要目的是比较不同实现方式之间的性能差异,找出性能瓶颈。1准备以_test.go结尾文件和导入testing包在命名文件时需要让文件必须以_test结尾,在文件中导入testing包。基准测试可以测试一段程序的运行性能及耗费CPU的程度,获得代码内存占用和运行效率的性能数据。G......
  • Excel分类后数字类型的内容值后面变为0
    背景在工作中经常遇到从日志或者其他地方拷贝过来的文本,里面使用其他分隔符进行分割。然而,使用Excel的分列功能进行分列后,发现数字类型的数值后面变为0。有时候我们就是需要原先的数值,该怎么办呢?比如,有如下的数据,以竖线|作为分割符。|员工编号|销售量|商品单价|销售额|20180......
  • Excel中文本型数字转换为数值型数字的方法
    背景工作中经常遇到需要将Excel中的内容进行求和或者其他计算,但是由于格式为文本,无法进行计算和求和。单元格的左上角都有绿色小三角,且用自动求和公式计算无法计算结果,显示为0,说明单元格格式为文本。1、直接将文本转化成数字需要转换的数据,左上角会出现黄色感叹号,点击,并选择......
  • Java入门题-输入3个数字比大小
    重要:能想明白输入数字之间大小比较的逻辑方式与之前相同,有关输入类型相关的,就需要引用Scanner方法 代码:不要忘记先 importjava.util.Scanner;1、复杂版-同时也是最开始思考时的思路版本intsave_number1=0,save_number2=0,save_number3=0;for(inti=1;i<4;......
  • Java入门题-判断输入数字是奇数还是偶数
    重要:需要引入Scanner方法importjava.util.Scanner; 代码:主要是通过求余方式处理解决 Scannerget_number=newScanner(System.in);intgetNumber=get_number.nextInt();if(getNumber%2==0){System.out.println(getNumber+"为偶数");}else{System.o......
  • 数字孪生融合GIS系统能够为物流行业提供什么解决方案?
    全球贸易和电子商务的不断发展,让物流行业面临着越来越多的挑战。其中,提高运输效率、降低成本、优化供应链和增强可持续性等问题成为业界关注的焦点。在这个数字化时代,数字孪生和GIS系统的融合为物流行业带来了全新的解决方案。数字孪生技术是将物理世界与数字世界进行连接和模拟......
  • go 语言实战入门案例之猜数字
    文章和代码已经归档至【Github仓库:<https://github.com/timerring/backend-tutorial>】或者公众号【AIShareLab】回复go也可获取。猜数字第一个例子里面,我们会使用Golang来构建一个猜数字游戏。在这个游戏里面,程序首先会生成一个介于1到100之间的随机整数,然后提示玩家进行......
  • 智能化建筑之路:数字孪生的角色与作用
    随着科技的不断进步,数字孪生技术正逐渐成为建筑行业的新宠。数字孪生是一种将实体世界与数字世界相结合的技术,通过将现实世界中的物体、系统或过程以数字化的方式进行建模和仿真,实现了真实世界与虚拟世界的互通。 在建筑行业中,数字孪生技术发挥着至关重要的作用。首先,它可以实......
  • 循环与递归输出数字的每一位
    #include<stdio.h>//循环voidprintN(intn){intmod=0;while((mod=n%10)!=0){printf("%d\n",mod);n=n/10;}}//递归voidprintn(intn){printf("%d\n",n%10);if(n>=10)......