ExtraTypeProvider 用于处理多余字段时提供类型信息
2、使用ExtraProcessor 处理多余字段 public static class VO { private int id; private Map<String, Object> attributes = new HashMap<String, Object>(); public int getId() { return id; } public void setId(int id) { this.id = id;} public Map<String, Object> getAttributes() { return attributes;} } ExtraProcessor processor = new ExtraProcessor() { public void processExtra(Object object, String key, Object value) { VO vo = (VO) object; vo.getAttributes().put(key, value); } }; VO vo = JSON.parseObject("{\"id\":123,\"name\":\"abc\"}", VO.class, processor); Assert.assertEquals(123, vo.getId()); Assert.assertEquals("abc", vo.getAttributes().get("name")); 3、使用ExtraTypeProvider 为多余的字段提供类型 public static class VO { private int id; private Map<String, Object> attributes = new HashMap<String, Object>(); public int getId() { return id; } public void setId(int id) { this.id = id;} public Map<String, Object> getAttributes() { return attributes;} } class MyExtraProcessor implements ExtraProcessor, ExtraTypeProvider { public void processExtra(Object object, String key, Object value) { VO vo = (VO) object; vo.getAttributes().put(key, value); } public Type getExtraType(Object object, String key) { if ("value".equals(key)) { return int.class; } return null; } }; ExtraProcessor processor = new MyExtraProcessor(); VO vo = JSON.parseObject("{\"id\":123,\"value\":\"123456\"}", VO.class, processor); Assert.assertEquals(123, vo.getId()); Assert.assertEquals(123456, vo.getAttributes().get("value")); // value本应该是字符串类型的,通过getExtraType的处理变成Integer类型了。 在 Spring MVC 中集成 Fastjson如果你使用 Spring MVC 来构建 Web 应用并对性能有较高的要求的话,可以使用 Fastjson 提供的FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化速度。下面是配置方式,非常简单。
XML式
如果是使用 XML 的方式配置 Spring MVC 的话,只需在 Spring MVC 的 XML 配置文件中加入下面配置即可
通常默认配置已经可以满足大部分使用场景,如果你想对它进行自定义配置的话,你可以添加 FastJsonConfig Bean。
<mvc:annotation-driven> <mvc:message-converters> <bean> <property ref="fastJsonConfig"/> </bean> </mvc:message-converters> </mvc:annotation-driven> <bean> <!-- 自定义配置... --> </bean>编程式
如果是使用编程的方式(通常是基于 Spring Boot 项目)配置 Spring MVC 的话只需继承 WebMvcConfigurerAdapter覆写configureMessageConverters方法即可,就像下面这样。
注意:
1、如果你使用的 Fastjson 版本小于1.2.36的话(强烈建议使用最新版本),在与Spring MVC 4.X 版本集成时需使用 FastJsonHttpMessageConverter4。
2、SpringBoot 2.0.1版本中加载WebMvcConfigurer的顺序发生了变动,故需使用converters.add(0, converter);指定FastJsonHttpMessageConverter在converters内的顺序,否则在SpringBoot 2.0.1及之后的版本中将优先使用Jackson处理。
在 Spring Data Redis 中集成 Fastjson通常我们在 Spring 中使用 Redis 是通过 Spring Data Redis 提供的 RedisTemplate 来进行的,如果你准备使用 JSON 作为对象序列/反序列化的方式并对序列化速度有较高的要求的话,建议使用 Fastjson 提供的 GenericFastJsonRedisSerializer 或 FastJsonRedisSerializer 作为 RedisTemplate 的 RedisSerializer。下面是配置方式,非常简单。
XML式
如果是使用 XML 的方式配置 Spring Data Redis 的话,只需将 RedisTemplate 中的 Serializer 替换为 GenericFastJsonRedisSerializer 即可。
下面是完整的 Spring 集成 Redis 配置供参考。
<!-- Redis 连接池配置(可选) --> <bean> <property value="${redis.pool.maxActive}"/> <property value="${redis.pool.maxIdle}"/> <property value="${redis.pool.maxWait}"/> <property value="${redis.pool.testOnBorrow}"/> <!-- 更多连接池配置...--> </bean> <!-- Redis 连接工厂配置 --> <bean> <!--设置连接池配置,不设置的话会使用默认的连接池配置,若想禁用连接池可设置 usePool = false --> <property ref="jedisPoolConfig" /> <property value="${host}"/> <property value="${port}"/> <property value="${password}"/> <property value="${database}"/> <!-- 更多连接工厂配置...--> </bean> <!-- RedisTemplate 配置 --> <bean> <!-- 设置 Redis 连接工厂--> <property ref="jedisConnectionFactory"/> <!-- 设置默认 Serializer ,包含 keySerializer & valueSerializer --> <property> <bean/> </property> <!-- 单独设置 keySerializer --> <property> <bean/> </property> <!-- 单独设置 valueSerializer --> <property> <bean/> </property> </bean>编程式