全解史上最快的JOSN解析库 - alibaba Fastjson (4)

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 配置文件中加入下面配置即可

<mvc:annotation-driven> <mvc:message-converters> <bean/> </mvc:message-converters> </mvc:annotation-driven>

通常默认配置已经可以满足大部分使用场景,如果你想对它进行自定义配置的话,你可以添加 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方法即可,就像下面这样。

@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); //自定义配置... //FastJsonConfig config = new FastJsonConfig(); //config.set ... //converter.setFastJsonConfig(config); converters.add(0, converter); } }

注意
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 即可。

<bean> <property ref="jedisConnectionFactory"/> <property> <bean/> </property> </bean>

下面是完整的 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>

编程式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywfjd.html