使用技巧:導入jar包,以下是 json lib 必須的架包commons-beanutils-1.8.0.jar
commons-collections-3.2.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar
- 將對象轉換成 Json字符串
//利用json-lib來將普通java對象轉換爲json字符串
@Test
public void testJavabean(){
Users user=new Users(1L,"張三",true,28,"黑龍江齊齊哈爾人");
JSONObject jsonObj=JSONObject.fromObject(dept);
System.out.println(jsonObj);
} - 將數組轉換成字符串
// 用 JSONArray 轉換集合,數組
@Test
public void testJSONArray(){
List<Users> users=new ArrayList<Users>();
Users user=new Users(1L,"張三",true,28,"黑龍江齊齊哈爾");
Users user1=new Users(2L,"張四",true,20,"山東濟寧梁山");
Users user2=new Users(3L,"張王妹",false,18,"湖北十堰武當山");
users.add(user);
users.add(user1);
users.add(user2);
JSONArray jsonArr=JSONArray.fromObject(users);
System.out.println(jsonArr);
} - 利用jsonConfig選擇性輸出
<!-- setExcludes用於排除某些屬性, -->
@Test
public void testFindById(){
List<Users> users=new ArrayList<Users>();
Users user=new Users(1L,"張三",true,28,"黑龍江齊齊哈爾");
Users user1=new Users(2L,"張四",true,20,"山東濟寧梁山");
Users user2=new Users(3L,"張王妹",false,18,"湖北十堰武當山");
users.add(user);
users.add(user1);
users.add(user2);
JsonConfig cfg=new JsonConfig();
cfg.setExcludes(new String[]{"sex"}); //指定做json轉換時要排除的屬性
JSONArray jsonArr=JSONArray.fromObject(users,cfg);
System.out.println(jsonArr);
} - 阻止自循環而導至死循環
<!-- 我們在結合hibernate 使用時, 查出的一個對象,通常帶有某些對象屬性,並且還是雙象關聯
如: 部門對象下有員工集合,員工對象裏有所屬部門對象
此時再直接轉換就會出現死循環
解決方法: 1.setExcludes排除
2.setCycleDetectionStrategy()
-->
@Test
public void testSetCycleDetectionStrategy(){
Dept dept=deptDao.findById(new Byte("20"));
Emp emp=new Emp();
dept.getEmps().add(emp);
emp.setDept(dept);
JsonConfig cfg=new JsonConfig();//雙向關聯死循環的解決方法
cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
JSONObject jsonObj=JSONObject.fromObject(dept,cfg);
System.out.println(jsonObj);
} - 用自帶的類型轉換器防止時間轉換出錯:此時 從數據庫返回的時間對象都是java.sql 包下的,直接轉會出錯,所以得用類型轉換換,json-lib自帶有
<!-- 直接轉換時間對象 registerJsonBeanProcessor()
JsDateJsonBeanProcessor 類
-->
@Test
public void testDataConvert(){
Date date=new java.sql.Date(System.currentTimeMillis());
JsonConfig cfg=new JsonConfig();
cfg.registerJsonBeanProcessor(java.sql.Date.class, new JsDateJsonBeanProcessor());
JSONObject jsonObj=JSONObject.fromObject(date,cfg);
System.out.println(jsonObj);
}<!-- 轉換時間屬性 registerJsonValueProcessor()
JsDateJsonValueProcessor 類
--->
@Test
public void testDataConvertProperty(){
Emp emp=new Emp();
emp.setHiredate(new java.sql.Date(System.currentTimeMillis()));
JsonConfig cfg=new JsonConfig();
cfg.registerJsonValueProcessor(java.sql.Date.class, new JsDateJsonValueProcessor());
JSONObject jsonObj=JSONObject.fromObject(emp,cfg);
System.out.println(jsonObj);
} - 自定義類型轉換器
<!-- 實現接口-->
@Test
public void testDataConvertProperty(){
Emp emp=new Emp();
emp.setHiredate(new java.sql.Date(System.currentTimeMillis()));
JsonConfig cfg=new JsonConfig();
cfg.registerJsonValueProcessor(java.sql.Date.class, new JsonValueProcessor(){
public Object processArrayValue(Object arg0, JsonConfig arg1) {
return new SimpleDateFormat("yyyy-MM-dd").format(arg0);
}
public Object processObjectValue(String arg0, Object arg1,
JsonConfig arg2) {
return new SimpleDateFormat("yyyy-MM-dd").format(arg1);
}
});
JSONObject jsonObj=JSONObject.fromObject(emp,cfg);
System.out.println(jsonObj);
} - json 轉換時 實現自定義key 輸出
@Test
public void testDataConvertProperty(){
Emp emp=new Emp(new Short("20"));
emp.setEname("張三");
emp.setJob("測試工程師");
JsonConfig cfg=new JsonConfig();
cfg.registerJsonBeanProcessor(Emp.class, new JsonBeanProcessor() {
/*** 實現轉換器接口方法,將指定的屬性轉換成需要的key
*/
public JSONObject processBean(Object arg0, JsonConfig arg1) {
Emp emp=(Emp) arg0;
return new JSONObject()//empno-->編號
.element("編號", emp.getEmpno())
//ename-->名字
.element("名字", emp.getEname())//job-->工作
.element("工作", emp.getJob());
}
});
JSONObject jsonObj=JSONObject.fromObject(emp,cfg);
System.out.println(jsonObj);
}//輸出: {"編號":20,"名字":"張三","工作":"測試工程師"}