针对这一情况。
我用的json转换工具是fastjson,网上查知fastjson 有ValueFilter接口可以实现自定义过滤
package com.alibaba.fastjson.serializer;
public interface ValueFilter extends SerializeFilter {
Object process(Object object, String name, Object value);
}
知道接口后就简单了。
process(Object object, String name, Object value) //三个参数,object 为要转成json的对象,name是对象的get/is方法的名字(去掉get或is前缀并首字母小写),value就是对应的get值
//思路就是通过object 和 name 反射方法得出 其return的类型。针对value== null 的基础数据类型的或者list的类型的做出不同处理
//实现的部分代码 (PS:时间类型 我也算到基础类型了。)
private static String[] types = {"java.lang.Integer",
"java.lang.Double",
"java.lang.Float",
"java.lang.Long",
"java.lang.Short",
"java.lang.Byte",
"java.lang.Boolean",
"java.lang.Char",
"java.lang.String",
"java.util.Date",
"int","double","long","short","byte","boolean","char","float"};
private static String first2Up(String str){
return str.substring(0,1).toUpperCase()+str.substring(1);
}
private static ValueFilter nullValueFilter = new ValueFilter(){
@Override
public Object process(Object object, String name, Object value) {
if(value==null){
try {
Method method = object.getClass().getDeclaredMethod("get" + first2Up(name));
for(String type : types){
if(method.getReturnType().getName().equals(type)){
return "";
}
}
if (method.getReturnType().isAssignableFrom(List.class) &&
!method.getReturnType().getName().equals("java.lang.Object")) {
return new int[0];
}
return new Object();
} catch (SecurityException | NoSuchMethodException e) {
e.printStackTrace();
return value;
}
}
return value;
}
};
private static String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static SerializeConfig mapping = new SerializeConfig();
static{
mapping.put(Date.class, new SimpleDateFormatSerializer(dateFormat));
}
//只是部分代码,有些数字类型,也需要加上引号 过滤的对象是notNullValueFilter,原理一样,就不贴出来了,mapping是对日期的格式化方法
public static String toJsonString(Object obj){
SerializeFilter[] filters = {nullValueFilter,notNullValueFilter};
return JSON.toJSONString(obj,mapping, filters);
}
附上原先的json接口转换方法,希望能抛砖引玉
public String object2Json(Object object) throws IOException {
if (!objectUtil.isNotEmpty(object)) {
return "";
}
ObjectMapper mapper = JacksonMapper.getInstance();
// 字段和值都加引号
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
//数字加引号
mapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS,true);
mapper.configure(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS, true);
mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>()
{
public void serialize(
Object value,
JsonGenerator jg,
SerializerProvider sp) throws IOException, JsonProcessingException
{
jg.writeString("");
}
});
return mapper.writeValueAsString(object);
}