您的位置:首页 > Web前端 > JavaScript

JSON小小结 - - - jackson, gson, json-lib

2016-02-16 15:17 591 查看

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"}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json gson json-lib