fastjson 如果指定不序列化某个类型, 比如MultipartFile,Part

mfuanj7w  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(98)

情景: 操作日志记录, 对于浏览器发送的参数及响应值进行日志记录. 参数如果是"文件", 则不序列化这个参数.

初步解决:

//记录非文件对象的其他参数
if(args.length > 0) {
	List<Object> params = Arrays.asList(args).stream().filter(obj -> !(obj instanceof MultipartFile || obj instanceof Part)).collect(Collectors.toList());
	log.setParamsJson(JSON.toJSONString(params));                    //参数的JSON
}

再次解决:

//记录非文件对象的其他参数
if(args.length > 0) {
    List<Object> params = Arrays.asList(args).stream().filter(obj -> {
        boolean need = true;
        //排除MultipartFile,Part
        if(obj instanceof MultipartFile || obj instanceof Part) need = false;
        
        //排除List<MultipartFile>,List<Part>
        if(obj instanceof List) {
            @SuppressWarnings("unchecked")
            List<Object> list = (List<Object>) obj;
            if(list.size() > 0) {
                Object object = list.get(0);
                if(object instanceof MultipartFile || object instanceof Part) need = false;
            }
        }
        return need;
    }).collect(Collectors.toList());
    log.setParamsJson(JSON.toJSONString(params));                    //参数的JSON
}

问题: 能不能直接指定MultipartFile和Part接口的实现类不序列化, 这样可以直接无论他们本身, 在List中, 在属性中等都可以忽略序列化

a11xaf1n

a11xaf1n1#

import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;

import javax.servlet.http.Part;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Collection;

public class FileSerializeFilter implements SerializeFilter {

    @Override
    public Object process(Object object, String name, Object value) {
        // 排除 MultipartFile 和 Part 接口的实现类
        if (value instanceof MultipartFile || value instanceof Part) {
            return null;
        }
        // 如果属性值是集合,则递归处理集合中的元素
        if (value instanceof Collection) {
            Collection<?> collection = (Collection<?>) value;
            collection.removeIf(item -> item instanceof MultipartFile || item instanceof Part);
        }
        return value;
    }
}

// 在日志记录中使用过滤器
public class YourLogger {
    
    public void log(Object... args) {
        // 记录非文件对象的其他参数
        if (args.length > 0) {
            List<Object> params = Arrays.stream(args)
                    .filter(obj -> !(obj instanceof MultipartFile || obj instanceof Part))
                    .collect(Collectors.toList());
            log.setParamsJson(JSON.toJSONString(params, new FileSerializeFilter(), SerializerFeature.IgnoreNonFieldGetter));
        }
    }
}

相关问题