使用技巧:导入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,"名字":"张三","工作":"测试工程师"}