因项目需求,写了个可以定制的解析,主要实现类似@jsonproperty的功能,但由xml配置实现,可以动态改变返回的json数据格式,大体思路如下:
配置xml 文件,自定义标签,然后自己在程序中解析:
设置json读取转化的时候,需要自己实现一个策略:
具体实现接口为jackson中的org.codehaus.jackson.map.PropertyNamingStrategy接口,目前jackson已经默认实现org.codehaus.jackson.map.PropertyNamingStrategy.PropertyNamingStrategyBase,可以覆盖自定义方法org.codehaus.jackson.map.PropertyNamingStrategy.PropertyNamingStrategyBase#translate即可:
/**
*
*/
private static class CapitalizedPropertyNamingStrategy extends PropertyNamingStrategy {
@Override
public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
String nameSpace = field.getAnnotated().getDeclaringClass().getName();
return translate(defaultName, nameSpace);
}
@Override
public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
String nameSpace = method.getAnnotated().getDeclaringClass().getName();
return translate(defaultName, nameSpace);
}
@Override
public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
String nameSpace = method.getAnnotated().getDeclaringClass().getName();
return translate(defaultName, nameSpace);
}
/**
* @return
* @throws Exception
*/
public static HashMap<String, HashMap> readXml(String xmlPath) throws Exception {
HashMap<String, HashMap> mapperMap = new HashMap<String, HashMap>();
InputStream in = ClassLoader.getSystemResourceAsStream(xmlPath);
loadXml(in, mapperMap);
return mapperMap;
}
public String translate(String propertyName, String nameSpace) {
try {
if(null == xmlMap || null == xmlMap.get(nameSpace)){
HashMap<String, HashMap> configMap = new HashMap<String, HashMap>();
configMap = readXml(xmlPath);
xmlMap.put(nameSpace,configMap);
}
} catch (Exception e) {
PlatformLogger.error("json序列化读取配置文件出错,错误原因" + e.getMessage());
}
if (null == xmlMap || null == xmlMap.get(nameSpace) || null == xmlMap.get(nameSpace).get(propertyName))
return propertyName;
return xmlMap.get(nameSpace).get(propertyName).toString();
}
}
读取到的配置文件再用dom4j进行解析:
这样功能即可实现,我们只需修改配置文件,可实现json可定制的转化