当前位置: 首页 > 编程笔记 >

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

衡泰
2023-03-14
本文向大家介绍golang中json反序列化可能遇到的问题,包括了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]

总结

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

 类似资料:
  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:

  • 问题内容: 我正在使用大猩猩 websocket,并且正在计划使用json进行序列化/反序列化。 假设我有这样的结构来接收传入的消息: 和 大猩猩提供接收传入的消息。传入的消息可以是Foo或Bar,但是我不能使用和收听其他消息,这很混乱。我想要像javascript 这样的东西。如果接收到Foo,则如何处理传入消息,然后将其存储到结构中;如果接收到Bar,则将其存储到结构中? 我正在解决方案正在使

  • 我写了下面的代码,它确实反序列化和解析了一个JSON变量,但是,它不能与多个JSON变量一起工作 API检索的JSON具有如下类似的变量,但是,第一个分支有一个总是变化的数字,比如value_abc_########,其中######是一个总是不同的数字,所以我不知道这个分支得到了什么输出。 这是API调用返回的JSON结构: 虽然这是我编写的代码,但如果JSON只有1个分支结果,它可以正常工作,

  • 问题内容: 既然没有,可以使用什么本机实现来处理呢? 我注意到了,并且可以使用此格式将数据格式化为JSON,但是如何反序列化? 或者,也许我缺少某些依赖项? 问题答案: 您可以使用,它的依赖项是的依赖项。因此,您无需在project.json中添加依赖项。 请注意,使用WebAPI控制器,您无需处理JSON。 更新ASP.Net Core 3.0 Json.NET已从ASP.NET Core 3.

  • 问题内容: 我很好奇序列化和反序列化的方式。我使用关键字“ json”和“ tuple”进行搜索,但找不到所需的内容。 问题答案: 我通过和Json.net进行测试,测试代码如下。结果显示可序列化和可反序列化。因此,我可以在应用程序中使用它们。 测试代码 注释 在将序列化到字符串{“项目1”:“一”,“项目2”:“嘻嘻”,“项目3”:真正},并且它可以被反序列化回类型。

  • 对于某些用例,我需要将一个POJO转换为另一个具有不同字段名称的POJO。我试着使用Jackson对象映射器。它在某些方面起了作用。然而,最终的结果并不是我所期望的。 如果运行,输出将是: SOUT:UserMap{name_new='Deepak',meta=address::Singapore,id::111} 杰克逊:{“姓名”:“迪帕克”,“地址”:“新加坡”,“身份证”:“111”} 我