当前位置: 首页 > news >正文

go~为什么会有json.Number这种类型存在

解决 JSON 数值类型的不确定性

在 JSON 格式里,数值类型没有明确区分整数和浮点数,一个数值可能是整数(如 123),也可能是浮点数(如 123.45)。而在 Go 语言中,整数(如 int、int64)和浮点数(如 float32、float64)是不同的类型。
当使用 json.Unmarshal 函数解析 JSON 数据时,如果直接将 JSON 数值映射到 Go 的整数或浮点数类型,可能会导致精度丢失或溢出问题。例如,JSON 中的一个很大的整数可能会超出 Go 中 int 类型的表示范围。json.Number 类型作为一种中间类型,可以用来接收 JSON 中的数值,避免这些问题。

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonData := `{"num": 12345678901234567890}`
    var data struct {
        Num json.Number `json:"num"`
    }
    err := json.Unmarshal([]byte(jsonData), &data)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Number as string:", data.Num.String())
}

在这个示例中,使用 json.Number 类型接收 JSON 中的大整数,避免了可能的溢出问题

延迟类型转换

json.Number 允许开发者在需要的时候再进行类型转换。在解析 JSON 数据时,可能并不清楚具体需要将数值转换为什么类型,或者需要根据不同的情况进行不同的转换。使用 json.Number 可以将类型转换的操作延迟到后续处理步骤中。

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

func main() {
    jsonData := `{"num": 123.45}`
    var data struct {
        Num json.Number `json:"num"`
    }
    err := json.Unmarshal([]byte(jsonData), &data)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    // 根据需要转换为不同类型
    floatVal, _ := data.Num.Float64()
    intVal, _ := data.Num.Int64()
    fmt.Println("Float value:", floatVal)
    fmt.Println("Int value:", intVal)
}

先使用 json.Number 接收 JSON 数值,然后根据需要将其转换为 float64 或 int64 类型。

保持数据的原始精度

json.Number 本质上是一个字符串类型,它会以字符串的形式保存 JSON 中的数值,从而保持数据的原始精度。在进行数值计算或处理时,可以根据具体需求选择合适的精度进行转换。

总结

json.Number 类型为处理 JSON 数值提供了一种灵活、安全的方式,避免了类型不匹配和精度丢失的问题

相关文章:

  • 大气体育直播模板赛事扁平自适应模板源码
  • 全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践
  • Django加bootstrap实现上传文件含有进度条
  • 与本地电脑PDF文档对话的PDF问答程序
  • 设备唯一ID获取,支持安卓/iOS/鸿蒙Next(uni-device-id)UTS插件
  • 【ROS2】【ROS2】RViz2源码分析(八):Display中订阅ROS2消息(使用Qt信号和槽传递ROS2消息)
  • Python递归函数
  • 设计模式教程:责任链模式(Chain of Responsibility Pattern)
  • 基于cppzmq和MsgPack封装的Publisher Subscriber - 发布订阅模式
  • 如何组织和管理JavaScript文件:最佳实践与策略
  • MATLAB进阶之路:数据导入与处理
  • Java File 类
  • rman 备份恢复1
  • spring日志
  • OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备
  • c语言基础第12节《函数的调用》
  • 怎么用cURL库对接智能语音播报设备
  • ShenNiusModularity项目源码学习(10:ShenNius.FileManagement项目分析)
  • Java语法-集合
  • Java——继承
  • 俄乌释放停火和谈信号,克宫:将组建“相应级别”谈判代表团
  • 巴西总统卢拉昨晚抵达北京
  • 碧桂园境外债务重组:相当于现有公众票据本金额逾50%的持有人已加入协议
  • 迪拜金融市场CEO:2024年市场表现出色,超八成新投资者来自海外
  • 李彦宏:技术迭代速度之快从业30年来未见过,要提升执行力战胜对手
  • 湖南张家界警方公告宣布一名外国人居留许可作废