1. 概述

在 Java 中处理 JSON 数据本可以很简单,但和 Java 里的大多数事情一样,我们面临太多选择——各种库、各种风格,一不小心就踩坑。

本文不搞花里胡哨,目标很明确:帮你快速理清当前主流的 JSON 库生态,避免选型纠结。我们会聚焦以下几个常见库:

  • Jackson —— 实际意义上的行业标准
  • Gson —— Google 出品,简单直接
  • ⚠️ json-io —— 小众但有特色
  • ⚠️ Genson —— 功能完整但社区偏弱
  • JSON-P (JSR 353) —— 官方标准 API,常被忽略

每个库我们都用统一结构讲解:先给学习资源,再上真实可运行的代码示例,让你一眼看出“写起来爽不爽”。

💡 提示:本文面向有经验的开发者,基础概念如 POJO、序列化等不再赘述。


2. 流行度与基础数据

选库第一步,看数据。以下为截至当前的 Maven 使用量与 GitHub 活跃度(数据越靠前越主流):

2.1. Jackson

  • Maven 使用量
    • jackson-databind: 2362k
    • jackson-core: 1377k
  • ⭐ GitHub Stars: 1457
  • 🍴 Forks: 585

✅ 毫无疑问的王者,Spring 生态默认集成,社区资源丰富到爆炸。

2.2. Gson

  • Maven 使用量: 1588k
  • ⭐ GitHub Stars: 2079
  • 🍴 Forks: 471

✅ Google 出品,API 极简,Android 开发者最爱。虽然 Maven 使用量略低于 Jackson,但 GitHub 星数反超,说明社区认可度高。

2.3. json-io

  • Maven 使用量: 11k
  • ⭐ GitHub Stars: 129
  • 🍴 Forks: 40

⚠️ 小众库,功能偏重“无侵入式”序列化,适合特定场景,但生态弱。

2.4. Genson

  • Maven 使用量: 8k
  • ⭐ GitHub Stars: 67
  • 🍴 Forks: 15

⚠️ 更小众,Scala 支持是亮点,但整体活跃度低,不推荐新项目使用。

2.5. JSON-P

  • ⭐ GitHub Stars: 119
  • 🍴 Forks: 54

✅ JSR 353 标准实现,Jakarta EE 官方 API。虽不直接用于日常开发,但作为底层标准,很多框架在其之上封装。


3. Jackson

目前 Java 生态中最主流的 JSON 处理库,功能全面,性能优秀,Spring 全家桶默认集成。

3.1. 学习资源

官方 & 社区

Baeldung 系列教程(强烈推荐)

其他优质文章

3.2. Maven 依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

🔔 注意:jackson-databind 会自动引入 jackson-corejackson-annotations,无需单独声明。

3.3. Jackson 简单示例

@Test
public void whenSerializeAndDeserializeUsingJackson_thenCorrect() 
    throws IOException {
    
    Foo foo = new Foo(1, "first");
    ObjectMapper mapper = new ObjectMapper();

    String jsonStr = mapper.writeValueAsString(foo);
    Foo result = mapper.readValue(jsonStr, Foo.class);
    
    assertEquals(foo.getId(), result.getId());
}

输出 JSON:

{
    "id": 1,
    "name": "first"
}

关键点:

  • mapper.writeValueAsString():对象 → JSON 字符串
  • mapper.readValue():JSON 字符串 → 对象
  • ⚠️ 默认使用字段名,无需注解(除非需要定制)

4. Gson

Google 开发的轻量级 JSON 库,API 设计简洁,适合快速开发和 Android 项目。

4.1. 学习资源

官方

Baeldung

其他

4.2. Maven 依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>

4.3. Gson 简单示例

@Test
public void whenSerializeAndDeserializeUsingGson_thenCorrect() {
    Gson gson = new Gson();
    Foo foo = new Foo(1, "first");

    String jsonStr = gson.toJson(foo);
    Foo result = gson.fromJson(jsonStr, Foo.class);
    
    assertEquals(foo.getId(), result.getId());
}

关键点:

  • gson.toJson():对象 → JSON
  • gson.fromJson():JSON → 对象
  • ✅ 无需 getter/setter,直接反射字段(即使 private)
  • ⚠️ 对泛型支持稍弱,需用 TypeToken 包装

5. json-io

一个专注于“完美序列化 Java 对象”的库,支持循环引用、私有字段等,但生态较弱。

5.1. 学习资源

5.2. Maven 依赖

<dependency>
    <groupId>com.cedarsoftware</groupId>
    <artifactId>json-io</artifactId>
    <version>4.13.0</version>
</dependency>

5.3. json-io 简单示例

@Test
public void whenSerializeAndDeserializeUsingJsonio_thenCorrect() {
    Foo foo = new Foo(1, "first");

    String jsonStr = JsonWriter.objectToJson(foo);
    Foo result = (Foo) JsonReader.jsonToJava(jsonStr);
    
    assertEquals(foo.getId(), result.getId());
}

输出 JSON:

{
    "@type": "org.baeldung.Foo",
    "id": 1,
    "name": "first"
}

关键点:

  • ✅ 自动写入类型信息(@type),反序列化更安全
  • ✅ 支持复杂对象图(如循环引用)
  • ❌ 输出带类型元数据,不适合对外暴露的接口

6. Genson

一个支持 Java 和 Scala 的 JSON 库,提供完整数据绑定和流式处理能力。

6.1. 学习资源

6.2. Maven 依赖

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>1.6</version>
</dependency>

6.3. Genson 简单示例

@Test
public void whenSerializeAndDeserializeUsingGenson_thenCorrect() {
    Genson genson = new Genson();
    Foo foo = new Foo(1, "first");

    String jsonStr = genson.serialize(foo);
    Foo result = genson.deserialize(jsonStr, Foo.class);
    
    assertEquals(foo.getId(), result.getId());
}

关键点:

  • ✅ API 简洁,类似 Gson
  • ✅ 支持流式处理、自定义转换器
  • ❌ 社区小,文档少,出问题难排查

7. JSON-P

Java 官方的 JSON 处理 API(JSR 353),属于 Jakarta EE 标准,提供低层解析与生成能力。

⚠️ 注意:它不是“拿来就用”的高层库,而是类似 SAX 的流式 API,适合构建框架或需要精细控制的场景。

7.1. 学习资源

7.2. Maven 依赖

<!-- API 接口 -->
<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.1.1</version>
</dependency>

<!-- 默认实现(GlassFish) -->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>jakarta.json</artifactId>
    <version>2.0.1</version>
</dependency>

7.3. JSON-P 简单示例

@Test
public void whenTransformingAndParsingUsingJsonp_thenCorrect() {
    Foo foo = new Foo(1, "First");
    
    // 构建 JSON 对象
    JsonObject json = Json.createObjectBuilder()
        .add("id", foo.getId())
        .add("name", foo.getName())
        .build();
    
    String result = json.toString();
    
    // 解析 JSON
    JsonParser parser = Json.createParser(new StringReader(result));
    while (parser.hasNext()) {
        JsonParser.Event event = parser.next();
        switch (event) {
            case VALUE_STRING:
                String value = parser.getString();
                assertEquals(foo.getName(), value);
                break;
        }
    }
    parser.close();
}

关键点:

  • Json.createObjectBuilder():构建 JSON
  • Json.createParser():流式解析
  • ⚠️ 属于低层 API,代码量多,不适合日常业务开发
  • ✅ 常用于框架底层(如 JAX-RS 实现)

8. 总结

库名 推荐指数 适用场景
Jackson ⭐⭐⭐⭐⭐ Spring 项目、微服务、高性能场景
Gson ⭐⭐⭐⭐☆ Android、简单项目、快速原型
json-io ⭐⭐☆☆☆ 需要完美序列化复杂对象图(如缓存)
Genson ⭐⭐☆☆☆ Scala 混合项目,或已有技术栈依赖
JSON-P ⭐⭐⭐☆☆ 框架开发、需要遵循 Jakarta EE 标准

结论

  • 新项目首选 Jackson,生态无敌,性能稳定。
  • Android 或轻量级后端可用 Gson,API 更友好。
  • 别碰 json-io 和 Genson,除非有特殊需求。
  • JSON-P 了解即可,知道它是“标准”就行。

📌 提醒:无论选哪个,保持团队统一比库本身更重要。别让同事看到你用 Genson 而全组都在用 Jackson。


原始标题:JSON in Java