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

网站建设 客户拜访/推广软件排行榜前十名

网站建设 客户拜访,推广软件排行榜前十名,用什么手机软件做网站,dedecms迁移wordpressGo json反序列化"null"踩坑 有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map func mergeContent(inputJson string, inputMap map[string]interface{}) (map[string]interface{}, e…

Go json反序列化"null"踩坑

有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map

func mergeContent(inputJson string, inputMap map[string]interface{}) (map[string]interface{}, error) {jsonMap := make(map[string]interface{})if inputJson != "" {decoder := jsoniter.NewDecoder(strings.NewReader(inputJson))decoder.UseNumber()if err := decoder.Decode(&jsonMap); err != nil {return nil, err}}//mergefor k, v := range inputMap {jsonMap[k] = v}return jsonMap, nil
}

看上去是不是一段很健康的代码?
结合标题再看看呢?
如果输入的json字符串是"null"会发生什么呢?

实验

func main(){inputMap := make(map[string]interface{})inputMap["test"] = 1outputMap, err := mergeContent("null", inputMap)if err != nil {fmt.Println("err:", err)return}fmt.Printf("output:%+v\n", outputMap)
}

不出意外的话,要出意外了
在这里插入图片描述
它说我给一个nil map赋值了,但我明明在反序列化之前给jsonMap初始化了的,原来,jsoniter这个库【其他库没测】在进行json序列化时,会把nil【即指针类型(比如slice、map和*T)的未初始化时的形态】序列化为字符串"null",反序列化时会把字符串"null",如果目标类型是指针类型,则会反序列化为nil

其他测试

知道现象和原因之后,我又测试了些其他的东西
需要注意的是fmt很多时候打印nil的指针类型时不会输出nil,比如nil的slice和map,会打印成[]和map[]

package mainimport ("fmt"jsoniter "github.com/json-iterator/go"
)type Marshaler struct {A map[string]interface{}B []stringC [10]intD *stringE *EEF stringg string
}
type EE struct {EEE []string
}func main() {mal := Marshaler{E: &EE{},}mal1 := &Marshaler{}e1 := &EE{}e2 := EE{EEE: []string{}}var t1 *stringvar t2 []intvar t3 map[string]interface{}var t4 = make([]string, 0)res1, _ := jsoniter.MarshalToString(mal)res2, _ := jsoniter.MarshalToString(mal1)res3, _ := jsoniter.MarshalToString(e1)res4, _ := jsoniter.MarshalToString(e2)res5, _ := jsoniter.MarshalToString(t1)res6, _ := jsoniter.MarshalToString(t2)res7, _ := jsoniter.MarshalToString(t3)res8, _ := jsoniter.MarshalToString(t4)fmt.Printf("res1: %+v\n", res1)fmt.Printf("res2: %+v\n", res2)fmt.Printf("res3: %+v\n", res3)fmt.Printf("res4: %+v\n", res4)fmt.Printf("res5: %+v\n", res5)fmt.Printf("res6: %+v\n", res6)fmt.Printf("res7: %+v\n", res7)fmt.Printf("res8: %+v\n", res8)params := make(map[string]interface{})if err := jsoniter.Unmarshal([]byte(res6), &params); err != nil {fmt.Println("null Unmarshal err:", err)} else {fmt.Printf("null Unmarshal map:  %+v\n", params)}if err := jsoniter.Unmarshal([]byte(res6), &mal); err != nil {fmt.Println("null Unmarshal err:", err)} else {fmt.Printf("null Unmarshal Marshaler: %+v\n", mal)}if err := jsoniter.Unmarshal([]byte(res6), &mal1); err != nil {fmt.Println("null Unmarshal err:", err)} else {fmt.Printf("null Unmarshal Marshaler: %+v\n", mal1)}if err := jsoniter.Unmarshal([]byte(res6), &t4); err != nil {fmt.Println("null Unmarshal err:", err)} else {fmt.Printf("null Unmarshal []string: %+v\n", t4)fmt.Println(t4 == nil)}
}

输出:

res1: {"A":null,"B":null,"C":[0,0,0,0,0,0,0,0,0,0],"D":null,"E":{"EEE":null},"F"
:""}
res2: {"A":null,"B":null,"C":[0,0,0,0,0,0,0,0,0,0],"D":null,"E":null,"F":""}    
res3: {"EEE":null}
res4: {"EEE":[]}
res5: null
res6: null
res7: null
res8: []
//下面的打印不够准确,看debug截图
null Unmarshal map:  map[]
null Unmarshal Marshaler: {A:map[] B:[] C:[0 0 0 0 0 0 0 0 0 0] D:<nil> E:0xc000
004510 F: g:}
null Unmarshal Marshaler: <nil>
null Unmarshal []string: []
true

在这里插入图片描述

补充说明

  • 默认的反序列化是用float64来接数字类型的,原来的数字太大会出现精度丢失问题 示例
  • "null"用int或float32等基础数字类型来接会变成默认值0
http://www.jmfq.cn/news/5045797.html

相关文章:

  • 织梦网站后台视频教程/手机推广app
  • 如何做网站站长/游戏推广论坛
  • 南京企业网站做优化/网域名查询地址
  • iis5.1新建网站/种子资源
  • icp网站备案系统/百度网页游戏
  • 做视频的网站/百度ai智能写作工具
  • 企业网站建设的流程/seo图片优化的方法
  • 建设部网站官网施工合同文本/网站关键词排名优化系统
  • 建公司网站需要哪些资料/宁波seo服务快速推广
  • 松江网站开发/老铁外链
  • 做海淘是在哪个网站/微信朋友圈广告怎么推广
  • 建站abc和凡科哪个好用/企业网络推广软件
  • cento安装wordpress/槐荫区网络营销seo
  • 网站聊天工具代码/首页优化排名
  • 如何构思公司网站/seo分析seo诊断
  • 西安建设集团网站/怎么自己做一个网站
  • 上海中国建设银行招聘信息网站/做优化关键词
  • 转入已备案网站/企业网站页面设计
  • 做音乐网站要什么源码/社群营销
  • seo建设网站/网络舆情监测系统软件
  • 网站如何实现微信登录界面/深圳华强北
  • 网站设计需求/百度怎么发布自己的广告
  • 秦皇岛网站制作/营销推广活动策划
  • 网站建设详细的步骤有哪些/可靠的网站优化
  • 乌鲁木齐网站技术服务电话/网站开发详细流程
  • 甘肃省城乡与建设厅网站首页/百度查询网
  • 安徽建站平台/郑州网络营销顾问
  • 温州微网站制作哪里有/关键词是什么意思
  • wordpress主题操作/seo零基础教学视频
  • 普通网站设计/全渠道营销管理平台