0x000
今天看项目看到下面一段代码
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor());
觉得有必要把json相关再温习一遍。
0x001
性能:
Jackson > Gson > Json-lib
依赖:
JSON-lib依赖commons系列的包及 ezmorph包共 5个
Jackson除自身的以外只依赖于commons-logging
0x002
虽然性能不太好 ,但是json-lib有一些特性在某些场景非常重要。
- 自定义转换模式
jsonConfig.registerJsonValueProcessor(xx.class, JsonValueProcessor) - 属性过滤器
jsonConfig.setJsonPropertyFilter(PropertyFilter) - 设置是否允许循环自包含
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
public class CycleObject {
private Long id;
private String name;
private CycleObject me = this;
...
public class Person {
private Long id;
private String name;
private Integer age;
private Date brithday;
private boolean online;
...
private static JsonConfig jsonConfig = new JsonConfig();
//1.自定义转换方式
public void testValueProcess(){
jsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
return this.process(value);
}
@Override
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return this.process(value);
}
public Object process(Object value){
if(value == null){
return "";
//处理Date类型数据
}else if(value instanceof Date){
return sdf.format((Date)value);
}else{
return value.toString();
}
}
});
Person p = new Person(1l, "jack", 20, new Date(), false);
System.out.println(JSONObject.fromObject(p, jsonConfig));
}
//2.过滤字段,属性过滤器
public void testPropertyFilter(){
jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
@Override
public boolean apply(Object source, String name, Object value) {
if(source instanceof Person){
//过滤name属性
if("age".equals(name)){
return true;
}
}
return false;
}
});
Person p = new Person(1l, "jack", 20, new Date(), false);
System.out.println(JSONObject.fromObject(p, jsonConfig));
}
//3.自包含属性设置
public void testCycleDetection(){
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
//不允许循环包含,设置为null或空
// jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.STRICT);
//如果有循环则报错
CycleObject obj = new CycleObject();
obj.setId(100l);
obj.setName("jack");
System.out.println(JSONObject.fromObject(obj, jsonConfig));
}
public static void main(String[] args) {
Demo demo = new Demo();
//demo.testValueProcess();
//{"age":20,"brithday":"2016-02-16","id":1,"name":"jack","online":false}
//{"brithday":{"date":16,"day":2,"hours":14,"minutes":41,"month":1,"seconds":12,"time":1455604872269,"timezoneOffset":-480,"year":116},"id":1,"name":"jack","online":false}
//demo.testCycleDetection();
//{"id":100,"me":null,"name":"jack"}
}