用 annotation 辅助 Json-lib 转换 JavaBean
2010-07-19 00:00:00 来源:WEB开发网首先,需要一个代码标注(IntegerCode)及一个处理这种标注的 PropertyFilter。
清单 7. IntegerCode 及 IntegerCodeFilter
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IntegerCode {
public int value();
}
public class IntegerCodeFilter extends AbstractMethodFilter {
// 代码处理器
private IntegerCodeProcessor _processor;
public IntegerCodeFilter(final IntegerCodeProcessor processor) {
_processor = processor;
}
// 不过滤属性,但当发现IntegerCode标注时,将数据传递给Processor
public boolean apply(final Method method) {
if (_processor == null) {
return false; // 表示没有特别的处理
}
if (method.isAnnotationPresent(IntegerCode.class)) {
IntegerCode anno = method.getAnnotation(IntegerCode.class);
int code = anno.value();
_processor.setMainCode(code); // 将code设置为主代码
}
return false;
}
}
现在,我们需要一个 JsonValueProcessor 来处理 IntegerCode 数据。
清单 8. IntegerCodeProcessor
public class IntegerCodeProcessor implements JsonValueProcessor {
private int _iMainCode;
public void setMainCode(final int mainCode) { _iMainCode = mainCode; }
public IntegerCodeProcessor() {
super();
} // END: IntegerCodeProcessor
private void reset() {
_iMainCode = -1;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value, jsonConfig);
} // END: processArrayValue
public Object processObjectValue(
String key, Object value, JsonConfig jsonConfig ) {
return process( value, jsonConfig );
} // END: processObjectValue
private Object process(Object value, JsonConfig jsonConfig) {
if (value == null) {
return null;
}
String ret = null;
if (value instanceof Integer && _iMainCode >= 0) {
int code = value.intValue();
switch (_iMainCode) {
case 100: // 这里使用简单的case 处理不同的代码
if (code == 1) { // 好一点的方式是从资源文件中读取对应值
ret = "man";
} else if (code == 2) {
ret = "woman";
} else {
ret = value.toString();
}
break;
default:
ret = value.toString();
break;
}
} else {
ret = value.toString();
}
reset(); // 处理后重置,以免影响其他 Integer 属性
return ret;
} // END: process
}
现在,我们创建一个 JavaBean:Student 来测试这个 Processor。
清单 9. 测试 IntegerCodeProcessor
public class Student {
private String name = "camry";
private int gender = 1;
// getters & setters
public String getName() { return name; }
@IntegerCode(100) // 性别主代码为 100
public int getGender() { return gender; }}
}
...
IntegerCodeProcessor processor = new IntegerCodeProcessor();
IntegerCodeFilter filter = new IntegerCodeFilter(processor);
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter( filter );
config.registerJsonValueProcessor(Integer.class, processor);
System.out.println( JSONSerializer.toJSON( new Student(), config ) );
// prints {“gender”:”man”, "name":"camry"}
结束语
Json-lib 可以很方便的进行 JavaBean 到 JSON 数据的转换,再结合 annotation 为 JavaBean 的属性定义元数据,可以减少代码,提高效率。
Tags:annotation 辅助 Json
编辑录入:爽爽 [复制链接] [打 印]赞助商链接