首页 > 其他分享 >golang1.6版本json包解析嵌套指针的问题小记

golang1.6版本json包解析嵌套指针的问题小记

时间:2023-04-27 12:44:31浏览次数:53  
标签:Bar 嵌套 json 版本 go golang1.6 foo 指针

指针的指针问题

本地跑的好好的,测试环境跑的好好,预发布环境(准线上环境),跪了。

起因就是:

1 a := &struct{s:""}
2 json.Unmarshal([]byte{}, &a)
3 fmt.Println(a.s) //报错行

第一行代码进行 &取地址,获得指针变量。

第二行代码,进行json解析的时候,传入了&a, 指针的指针,a到了json包实际为: **a。

在第三行代码,go版本1.6环境中,会报错,panic。

内容为:

1 ····
2 PANIC:runtime error: invalid memory address or nil pointer dereference 
3 ····

空指针报错。

这个好解决

1 1 a := &struct{s:""}
2 2 json.Unmarshal([]byte{}, a) //直接传入即可 不再进行获取指针的动作从而造成指针的指针
3 3 fmt.Println(a.s) //报错行

 

关于嵌套指针丢失指针的问题

在Golang的1.6版本中,使用encoding/json包解析指针的指针时会出现错误。原因是1.6版本的编码器无法正确处理指针的指针,会导致在编码和解码过程中丢失一层指针。

而在新版本的Golang(1.7+)中, encoding/json包已经改进,可以自动处理指针的指针,不需要特殊处理。

所以总结来说,对于Golang 1.6版本处理指针的指针JSON编码问题,

有两种解决方案:

1. 升级Golang版本到1.7+,encoding/json包会自动处理指针的指针。

2. 在1.6版本使用NewEncoder和NewDecoder,设置SetEscapeHTML(false),手动管理指针层级。

关于2的解决方案:

例如,有如下结构:
1 go
2 type Foo struct {
3     Bar *Bar
4 }
5 
6 type Bar struct {
7     Baz string 
8 }

 

如果有如下数据:
1 go
2 bar := &Bar{"hello"}
3 foo := &Foo{bar} 
进行JSON编码后:
1 go
2 data, _ := json.Marshal(foo)
3 // 输出 {"Bar":{"Baz":"hello"}}
解码后:
1 go 
2 var foo Foo
3 json.Unmarshal(data, &foo)
4 // foo.Bar.Baz 输出 hello
5 // 但此时 foo.Bar 不是原来的指针,丢失了一层指针

 

为了解决这个问题,在1.6版本中,可以使用encoding/json中的Encoder和Decoder,并设置Encoder.SetEscapeHTML(false),手动管理指针。例如:
 1 go
 2 enc := json.NewEncoder(os.Stdout)
 3 enc.SetEscapeHTML(false) 
 4 enc.Encode(foo) // 输出 {"Bar":{"*":{"Baz":"hello"}}}
 5 
 6 var foo Foo 
 7 dec := json.NewDecoder(os.Stdin)
 8 dec.Decode(&foo)
 9 // 此时foo.Bar是一个指针,需要手动取值
10 foo.Bar = foo.Bar.(*Bar) 

标签:Bar,嵌套,json,版本,go,golang1.6,foo,指针
From: https://www.cnblogs.com/supermarx/p/17358601.html

相关文章

  • @JsonFormat和@DataFormat注解解决前后端日期格式一致性问题
    场景分析场景1:当我们从数据库中查询某篇博客文章数据时,blog表中文章发布日期blog_date这个字段,如果未经过处理,后端查询到的数据传到前端进行展示时,会得到一个不太符合我们要求的日期格式,比如:"blog_date":"2020-12-01T14:25:31.296+0000",为了解决这个问题,将后端返回给前端的日......
  • activity嵌套fragment 并 启动activity
    1.MainActivityFragmentManagerfragmentManager;FragmentTransactiontransaction;privatevoidreplaceFragment(Fragmentfragment){//1.获取FragmentManager,在活动中可以直接通过调用getFragmentManager()方法得到fragmentManager=getSupportFragme......
  • 第三十二章 JSON
    学习要点:1.JSON语法2.解析和序列化前两章我们探讨了XML的结构化数据,但开发人员还是觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON的结构化数据出现了。JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据。一.JSON语法JSON......
  • [转]前端传嵌套对象参数给spring mvc
    在使用springmvc开发web应用时,感觉springmvc的controller方法能自动将参数注入到方法的参数对象中,极大的方便了开发。但是,在遇到有嵌套对象的时候,比如订单对象有个属性是用户对象,就不好处理了。一种情况是,传递的参数都是作为post方法的请求体,我们可以用RequestBody注解。但是当条......
  • in(子查询/嵌套查询)
    in的基础用法:in一般用在where的后面,查询一个范围内的数据,如果是notin则查询不在这个范围内的数据select*from(表)where(表达式)in(字段1,字段2。。。)grade表student表   查询grade表中的语文和数学成绩......
  • JSON View谷歌浏览器插件使用
    JSONVIewer:sourcecode:https://github.com/tulios/json-viewer谷歌浏览器插件,用于展示JSON、JSONP格式的代码文件。网页显示效果如下:插件主要参数修改:font-size:字体大小;line-height:行高。官网介绍:ThemostbeautifulandcustomizableJSON/JSONPhighlighterthatyou......
  • Django之视图函数层 (必会三板斧 JsonResponse对象 request对象获取文件 FBV与CBV
    目录视图层之必会三板斧用来处理请求的视图函数都必须返回HttpResponse对象情况一:啥也不返回这里会报一个没有返回HttpResponse对象的错误,由此可见必须要返回一个HttpResponse对象情况二:返回HttpResponse对象点击Ctrl键查看源码可见是HttpResponse类,所以会返回一个值情......
  • okhttp3的基本使用(post发送json示例)
    依赖<!--https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><ve......
  • spring mvc3.2 requestbody json显示原理
    1,publicinterfaceHandlerMethodReturnValueHandler{ /** *Whetherthegiven{@linkplainMethodParametermethodreturntype}is *supportedbythishandler. * *@paramreturnTypethemethodreturntypetocheck *@return{@codetrue}ifthis......
  • Django框架——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、requ
    路由分发#Django支持每个应用都可以有自己独立的路由层、静态文件、模版层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由与视图函数的对应关系这个时候可以拆分到各自的路由层中使用路由分发之前总路由直接是路由与视图......