Java JSON绑定API:JSR 367详解

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 包(包名从 javaxjakarta
  • 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/

相关推荐
要开心吖ZSH8 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh12 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯14 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育14 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵14 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔16 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影16 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213117 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔17 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城18 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源