天天看點

Jackson 背景将javabean對象、List轉為json格式字元串并傳回,同時前台解析

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"}),如圖:

Jackson 背景将javabean對象、List轉為json格式字元串并傳回,同時前台解析

二、java對象序列化為json對象時,如果一個實體類與另一個實體類相關聯,則會造成序列化死遞歸,即使是将List序列化為json鍍對象,如果List中的javabean與另一個實體類相關聯,同樣會造成死遞歸。這種情況可以在多對一的多表中,通過在關聯的屬性上注解@JsonIgnore來解決:

實體類Programa中:

@ManyToOne

@JoinColumn(name="sid")  //站點, 多對一

@JsonIgnore

private Site site;

Jackson 背景将javabean對象、List轉為json格式字元串并傳回,同時前台解析