1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| package com.tohours.cnTools.handler;
import java.io.IOException; import java.lang.reflect.Field; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonFilter; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
public class MyJsonFilterSerializer { private static final String DYNC_INCLUDE = "DYNC_INCLUDE";// 包含的标识 private static final String DYNC_EXCLUDE = "DYNC_EXCLUDE";// 过滤的标识 private ObjectMapper mapper = new ObjectMapper();
@JsonFilter(DYNC_EXCLUDE) interface DynamicExclude { }
@JsonFilter(DYNC_INCLUDE) interface DynamicInclude { }
public void filter(Class<?> clazz, String include, String exclude) { if (clazz == null) return; if (include != null && include.length() > 0) { // 包含的操作 mapper.setFilterProvider(new SimpleFilterProvider().addFilter(DYNC_INCLUDE, SimpleBeanPropertyFilter.filterOutAllExcept(include.split(",")))); // 多个字段用,分割开 mapper.addMixIn(clazz, DynamicInclude.class); } else if (exclude != null && exclude.length() > 0) { mapper.setFilterProvider(new SimpleFilterProvider().addFilter(DYNC_EXCLUDE, SimpleBeanPropertyFilter.serializeAllExcept(exclude.split(",")))); mapper.addMixIn(clazz, DynamicExclude.class); } // 日期格式化 JavaTimeModule javaTimeModule = new JavaTimeModule(); String pattern = "yyyy-MM-dd HH:mm:ss"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); javaTimeModule.addSerializer(new LocalDateTimeSerializer(formatter));
// 处理一下字段为空的时候的返回值 mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object o, JsonGenerator gen, SerializerProvider serializers) throws IOException { String fieldName = gen.getOutputContext().getCurrentName(); try { // Reflection get field type Field field = gen.getCurrentValue().getClass().getDeclaredField(fieldName); if (Objects.equals(field.getType(), String.class)) { // 空字符串返回 "" gen.writeString(""); return; } else if (Objects.equals(field.getType(), List.class)) { // 空list返回 [] gen.writeStartArray(); gen.writeEndArray(); return; } else if (Objects.equals(field.getType(), Map.class)) { // 空map返回 {} gen.writeStartObject(); gen.writeEndObject(); return; } else if (Objects.equals(field.getType(), Object.class)) { // 空Object返回 {} gen.writeStartObject(); gen.writeEndObject(); return; } } catch (NoSuchFieldException e) { } gen.writeString(""); }
}); mapper.registerModule(javaTimeModule); }
public String toJson(Object object) throws JsonProcessingException { return mapper.writeValueAsString(object); }
@SuppressWarnings("rawtypes") public static void main(String[] args) throws JsonProcessingException {
MyJsonFilterSerializer cjs = new MyJsonFilterSerializer(); // 只包含 id, name cjs.filter(HashMap.class, "id,name", null); HashMap<String, String> test = new HashMap<>(); test.put("nxx", "nxx"); test.put("id", "nxx"); test.put("name", "nxx"); String include = cjs.toJson(test); System.out.println("include: " + include);
cjs = new MyJsonFilterSerializer(); // 过滤掉 id, name cjs.filter(HashMap.class, null, "childKey");
HashMap<String, HashMap> test2 = new HashMap<>(); HashMap<String, String> child = new HashMap<>(); child.put("childKey", "childValue"); test2.put("nxx", null); String filter = cjs.toJson(test2); System.out.println("filter: " + filter);
} }
|