Jackson 后台将javabean对象、List转为json格式字符串并返回,同时前台解析

Controller中:

@ResponseBody @RequestMapping(value = "/getList",produces="application/json;charset=UTF-8") //设置json返回前台的编码格式,默认是ISO-**,中文会乱码,可以通过produces来设置 public String getProgramaList2(){ List list=programaService.getAll();//查询Programa的集合list; //ObjectMapper和StringWriter都是jackson中的,通过这两个可以实现对list的序列化 ObjectMapper mapper = new ObjectMapper(); StringWriter w = new StringWriter(); //Convert between List and JSON try { mapper.writeValue(w, list);//开始序列化 } catch (JsonProcessingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { system.err.println("finally"); } System.out.println(w.toString()); //输出json格式的字符串 return w.toString(); //将json格式的字符串返回给前台 } //提示:这种方式还可以将javabean对象转换成json串,当然也可以通过String json=mapper.WriteValueAsString(p)来转换(其中mapper仍来自//上面的mapper类,p是new出来的对象); 前台js: $("#menu-text").click(function(){ alert("触发点击事件"); $.ajax({ url:"/cms/programa/getList",//前台页面指定进入上面controller的url dataType:"json", //指定前台接收的数据类型 async:true, type:"post", success:function(data){ alert(data[0].proName); //得到返回json串中第一个数组的proName对应的value. } }) })



这里有两点需要注意:

一、如果获取数据的方式采用hibernate的load()方法,按上述方法序列化javabean对象或者是List时可能会有关Lazy****proxy***等的异常(已记不清,转换后的json字符串会有handler这个单词),这是因为load()获取数据的方式支持延迟加载,如果需要通过上述方式序列化对象或是List,需要在javabean的类上面添加如下注解:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}),如图:


二、java对象序列化为json对象时,如果一个实体类与另一个实体类相关联,则会造成序列化死递归,即使是将List序列化为json镀对象,如果List中的javabean与另一个实体类相关联,同样会造成死递归。这种情况可以在多对一的多表中,通过在关联的属性上注解@JsonIgnore来解决:

实体类Programa中:

@ManyToOne
@JoinColumn(name="sid")  //站点, 多对一

@JsonIgnore
private Site site;


你可能感兴趣的:(json)