Controller中:
@ResponseBody
@RequestMapping(value = "/getList",produces="application/json;charset=UTF-8")
//設定json傳回前台的編碼格式,預設是ISO-**,中文會亂碼,可以通過produces來設定
public String getProgramaList2(){
List<programa> 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.
}
})
})
<br/>
</programa>
這裡有兩點需要注意:
一、如果擷取資料的方式采用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;