JSR 367(Java Specification Request 367)的正式名称是:
Java™ API for JSON Binding (JSON-B)
(Java JSON 绑定 API)
它是由 Java Community Process(JCP)制定的一项规范,首次在 Java EE 8(2017 年)中引入 ,旨在为 Java 平台提供一套标准化、可移植、易用的 API,用于将 Java 对象与 JSON 数据进行相互转换(序列化与反序列化)。
一、为什么需要 JSR 367?
在 JSON-B 出现之前,Java 生态中已有多个 JSON 库(如 Jackson、Gson、Eclipse MOXy),但它们:
- API 不统一:每个库有自己的注解和配置方式
- 缺乏标准:导致应用与特定实现强耦合
- Java EE 缺失官方支持:开发者需自行集成第三方库
JSR 367 的目标就是:
✅ 提供 官方标准 JSON 绑定 API
✅ 与 Java EE / Jakarta EE 深度集成
✅ 支持注解驱动、配置灵活、开箱即用
二、核心功能
JSON-B 允许你轻松实现:
- Java 对象 → JSON 字符串(序列化)
- JSON 字符串 → Java 对象(反序列化)
示例代码:
java
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
public class Person {
public String name;
public int age;
}
// 序列化
Person p = new Person();
p.name = "Alice";
p.age = 30;
Jsonb jsonb = JsonbBuilder.create();
String json = jsonb.toJson(p);
// 输出: {"name":"Alice","age":30}
// 反序列化
Person p2 = jsonb.fromJson(json, Person.class);
三、关键特性
| 特性 | 说明 |
|---|---|
| 注解支持 | @JsonbProperty, @JsonbTransient, @JsonbDateFormat 等控制序列化行为 |
| 自定义配置 | 通过 JsonbConfig 设置命名策略(如 snake_case)、日期格式、是否美化输出等 |
| 类型安全 | 泛型支持良好,fromJson(String, Class<T>) 返回具体类型 |
| 与 JSON-P 集成 | 基于 JSR 353(Java API for JSON Processing),可与 JsonObject/JsonArray 互操作 |
| 默认实现 | Eclipse Yasson 是官方参考实现(RI),随 GlassFish、WildFly 等 Java EE 8+ 容器提供 |
配置示例:
java
JsonbConfig config = new JsonbConfig()
.withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES)
.withFormatting(true);
Jsonb jsonb = JsonbBuilder.create(config);
四、常用注解
| 注解 | 作用 |
|---|---|
@JsonbProperty("custom_name") |
自定义 JSON 字段名 |
@JsonbTransient |
忽略该字段(不参与序列化/反序列化) |
@JsonbDateFormat("yyyy-MM-dd") |
指定日期格式 |
@JsonbNumberFormat("#.##") |
数字格式化 |
@JsonbTypeAdapter(MyAdapter.class) |
使用自定义适配器处理复杂类型 |
五、与主流库对比
| 特性 | JSON-B (JSR 367) | Jackson | Gson |
|---|---|---|---|
| 标准化 | ✅ JCP 官方标准 | ❌ 社区库 | ❌ 社区库 |
| Java EE 集成 | ✅ 原生支持 | 需手动集成 | 需手动集成 |
| 学习成本 | 低(API 简洁) | 中高 | 低 |
| 灵活性 | 中 | 极高 | 中 |
| 性能 | 良好 | 优秀 | 良好 |
💡 如果你在开发 Jakarta EE / Java EE 应用,优先使用 JSON-B;若需极致性能或高级特性(如 mixin、树模型),可考虑 Jackson。
六、现状与演进
- Java EE 8:JSR 367 首次发布
- Jakarta EE 8/9/10 :规范迁移到
jakarta.json.bind包(包名从javax→jakarta) - MicroProfile:从 MicroProfile 1.4 起支持 JSON-B
- Spring Boot:默认仍使用 Jackson,但可轻松切换到 JSON-B
七、总结
| 项目 | 内容 |
|---|---|
| JSR 编号 | 367 |
| 规范名称 | Java API for JSON Binding (JSON-B) |
| 首次发布 | Java EE 8 (2017) |
| 核心价值 | 提供标准、可移植的 Java ↔ JSON 转换 API |
| 典型场景 | RESTful Web 服务(JAX-RS)中的自动对象序列化 |
| 参考实现 | Eclipse Yasson |
🌐 有了 JSR 367,Java EE/Jakarta EE 开发者终于拥有了自己的"官方 JSON 库",无需再依赖第三方实现即可构建现代化 Web API。
官方文档(Jakarta EE 版本):
https://jakarta.ee/specifications/jsonb/