Json序列化工具封装(基于Jackson)

165 阅读1分钟
public class JsonProvider {
    
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    private static final JavaTimeModule JAVA_TIME_MODULE = new JavaTimeModule();

    static {
        JAVA_TIME_MODULE.addSerializer(LocalDateTime.class, new JsonLocalDateTimeSupport.LocalDateTimeSerializer());
        JAVA_TIME_MODULE.addDeserializer(LocalDateTime.class, new JsonLocalDateTimeSupport.LocalDateTimeDeserializer());
        OBJECT_MAPPER.registerModule(JAVA_TIME_MODULE);
    }

    public static ObjectMapper getJson() {
        return OBJECT_MAPPER;
    }

    public static JavaTimeModule getJavaTimeModule() {
        return JAVA_TIME_MODULE;
    }

    
}

这里添加了一个关于LocalDateTime的序列化反序列化,项目权局避免使用Date,所以直接不做处理,只需要权局规范好LocalDateTime,可以按需添加.
附上LocalDateTime的操作:

public interface JsonLocalDateTimeSupport {
    
    // 序列化实现
    final class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
        
        @Override
        public void serialize(LocalDateTime localDateTime, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            if (localDateTime != null) {
                long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
                gen.writeNumber(timestamp);
            }
        }
    }
    
    // 反序列化实现
    final class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
        
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext)
                throws IOException {
            long timestamp = p.getValueAsLong();
            if (timestamp > 0) {
                return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
            } else {
                return null;
            }
        }
    }
    
}

对JsonPrivoder继续包装一层,方便代码中使用

@Slf4j
public class JsonSupport {
    
    private static final ObjectMapper OBJECTMAPPER = JsonProvider.getJson();
    
    private JsonSupport() {
    }
    
    private static ObjectMapper getObjectMapper() {
        return OBJECTMAPPER;
    }
    
    public static TypeFactory getTypeFactory() {
        return OBJECTMAPPER.getTypeFactory();
    }
    
    /**
     * 执行操作
     *
     * @param callable 操作
     * @param <T>      返回泛型
     * @return 返回
     */
    public static <T> T tryDo(Callable<T> callable) {
        try {
            return callable.call();
        } catch (Exception e) {
            log.error("Json转换错误", e);
            throw new BusinessException(DATA_EXCEPTION, e);
        }
    }
    
    public static <T> T parse(String json, Class<T> clz) {
        return tryDo(() -> getObjectMapper().readValue(json, clz));
    }
    
    public static <T> T parseType(String json, JavaType javaType) {
        return tryDo(() -> getObjectMapper().readValue(json, javaType));
    }
    
    public static <K, V> Map<K, V> parseMap(String json, Class<K> kClass, Class<V> vClass) {
        return parseType(json, getTypeFactory().constructMapType(Map.class, kClass, vClass));
    }
    
    public static <T> List<T> parseList(String json, Class<T> clz) {
        return parseType(json, getTypeFactory().constructCollectionType(List.class, clz));
    }
    
    public static String toJson(Object obj) {
        return tryDo(() -> getObjectMapper().writeValueAsString(obj));
    }
    
}

附上springmvc的localdateTime处理 (springboot 2.7)

@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
    
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //统一返回值处理
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
                .modules(JsonProvider.getJavaTimeModule())
                .build();
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
        converters.replaceAll(c -> c instanceof MappingJackson2HttpMessageConverter ? converter : c);
    }
    
}

附上Redis序列化补充操作

@Configuration
public class RedisConfig extends CachingConfigurerSupport implements Serializable {
    
    @Bean(name = "jsonRedisTemplate")
    public RedisTemplate<String, Object> jsonRedisTemplate(RedisConnectionFactory factory) {
        final RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        
        // 设置Key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        
        final Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        
        ObjectMapper objectMapper = new ObjectMapper();
        
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.registerModule(JsonProvider.getJavaTimeModule());
        
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
        jsonRedisSerializer.setObjectMapper(objectMapper);
        
        // 设置Value的序列化器
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        //hash的序列化器
        redisTemplate.setHashKeySerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        
        // 使配置生效
        redisTemplate.afterPropertiesSet();
        
        return redisTemplate;
    }
    
}