Java处理JSON编程实用技巧

以下是2025–2026年视角下,Java 处理 JSON 最实用、最常被用到的技巧汇总(主要基于目前最主流的几种库)。

目前主流选择排序(推荐优先级):

排名推荐场景性能活跃度Spring Boot 3.x 默认
1Jackson企业级、复杂对象、Spring全家桶★★★★★★★★★★
2Fastjson2追求极致性能、对安全性要求不高场景★★★★★★★★★☆
3GsonAndroid、轻量简单场景★★★★☆★★★★☆
4JSON-B纯Jakarta EE 项目、标准★★★☆☆★★★☆☆部分

1. 最推荐的现代依赖(2025-2026主流写法)

<!-- Jackson(强烈推荐) -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>  <!-- 或更新版本 -->
</dependency>
<!-- 如果需要JDK17+记录类、虚拟记录等支持 -->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk17</artifactId>
    <version>2.17.2</version>
</dependency>

<!-- Fastjson2(性能党选择) -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.50</version>  <!-- 关注安全公告 -->
</dependency>

<!-- Gson(轻量选择) -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.11.0</version>
</dependency>

2. 最高频实用技巧清单(带代码)

技巧1:优雅处理 LocalDateTime / Instant(最痛点之一)

// Jackson 推荐写法(全局配置一次即可)
ObjectMapper mapper = JsonMapper.builder()
    .addModule(new JavaTimeModule())           // 支持 java.time.*
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
    .build();

// 或使用注解(更精细控制)
public class Order {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate deliveryDate;
}

Fastjson2 等价写法:

JSONWriter.Feature.WriteDateUseDateFormat,
JSONWriter.Feature.WriteLocalDateTimeAsString

技巧2:忽略 null 值 & 空集合(减小报文体积)

// Jackson
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);         // null不输出
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);        // 空集合/空串不输出

// 字段级别
@JsonInclude(JsonInclude.Include.NON_NULL)
private String remark;

技巧3:字段名风格自动转换(最常用场景)

// Jackson - snake_case ↔ camelCase
mapper.registerModule(new SimpleModule()
    .addSerializer(String.class, new PropertyNamingStrategies.SnakeCaseStrategy()...));

// 或全局配置(Spring Boot常用)
@Bean
public ObjectMapper objectMapper() {
    return JsonMapper.builder()
        .propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
        .build();
}

技巧4:处理未知字段不报错(向前兼容神器)

// Jackson
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

// Fastjson2
JSONReader.Feature.IgnoreAutoTypeNotMatch,
JSONReader.Feature.ErrorOnUnknown

技巧5:泛型集合反序列化(最容易出错的地方)

// Jackson 推荐写法
List<User> users = mapper.readValue(json, 
    mapper.getTypeFactory().constructCollectionType(List.class, User.class));

// 更复杂的嵌套泛型
Map<String, List<User>> data = mapper.readValue(json,
    new TypeReference<>() {});

Gson 等价:

Type type = new TypeToken<List<User>>(){}.getType();
List<User> users = gson.fromJson(json, type);

技巧6:超大 JSON → 流式处理(内存杀手克星)

// Jackson 流式读取(推荐)
try (JsonParser parser = mapper.createParser(hugeJsonInputStream)) {
    while (parser.nextToken() != null) {
        if (parser.currentToken() == JsonToken.FIELD_NAME) {
            String field = parser.getCurrentName();
            if ("orders".equals(field)) {
                parser.nextToken(); // 进入数组
                while (parser.nextToken() != JsonToken.END_ARRAY) {
                    Order order = mapper.readValue(parser, Order.class);
                    // 逐条处理
                }
            }
        }
    }
}

技巧7:JSON Patch / JSON Merge Patch(声明式修改)

// Jackson 支持 RFC 6902
JsonNode patchNode = mapper.readTree(patchJson);
ObjectMapper mapperWithPatch = JsonMapper.builder().build();
JsonNode target = mapperWithPatch.readerFor(User.class)
    .with(new JsonPatch(patchNode))
    .readValue(originalUserJson);

技巧8:快速脱敏 / 过滤敏感字段(合规必备)

// Jackson 方式一:@JsonFilter
@JsonFilter("sensitiveFilter")
public class User { ... }

// 方式二:自定义 Serializer
public class MaskPhoneSerializer extends StdSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider p) {
        if (value != null && value.length() == 11) {
            gen.writeString(value.substring(0,3) + "****" + value.substring(7));
        }
    }
}

技巧9:Fastjson2 高性能实用配置(追求极致时用)

JSONWriter jsonWriter = JSONWriter.ofUTF8()
    .setFeatures(
        JSONWriter.Feature.WriteNullsAsEmptyString,
        JSONWriter.Feature.PrettyFormatIfLengthGt512,
        JSONWriter.Feature.NotWriteDefaultValue
    );

快速选择建议表(2026视角)

你最在意的点推荐库次选
Spring Boot 3.x 项目Jackson
最高性能Fastjson2Jackson
Android 开发GsonFastjson2
内存极度敏感 + 大JSONJackson Stream
代码最少、最简单GsonFastjson2
需要严格标准合规JSON-B / Jackson

你目前项目用的是哪个库?或者主要痛点是什么(日期、泛型、性能、内存、字段风格……)?可以讲得更具体一些,我可以给你更针对性的写法。

文章已创建 4915

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部