引言
java里,json框架何其多,常见的有jackson、fastjson、gson等。各自的api互不相通,与代码耦合度高,切换代码非常高。如果使用json的api为统一的入口,各家再进行实现,代码与实现类不耦合,像slf4j一样,切换log框架(log4j/logback等)也不用改代码,代码只对api依赖,不对实现依赖,那就很好了。
jakarta.json项目就是为了解决这个问题的。自从javax改名jakarta,并全部给eclipse基金会运营,jakarta.json作为JAKARTA EE子项目之一也得到了支持。
引入依赖
<dependency><groupId>jakarta.json.bind</groupId><artifactId>jakarta.json.bind-api</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.eclipse</groupId><artifactId>yasson</artifactId><version>3.0.3</version></dependency>
jakarta.json.bind-api是jsonb的接口包,里面只有对象定义、接口定义等,没有代码实现。yasson则对jsonb规范进行了完整实现。
将一个对象序列化为json字符串
@Testvoid serialize() {User user = new User("John", 12, "This is a test", LocalDate.parse("2020-01-01"));String json = JsonbBuilder.create().toJson(user);System.out.println(json);}
将一个对象序列化为json字符串(格式化)
@Testvoid prettySerialize() {User user = new User("John", 12, "This is a test", LocalDate.parse("2020-01-01"));String json = JsonbBuilder.create(new JsonbConfig().withFormatting(true)).toJson(user);System.out.println(json);}
将一个json字符串反序列化为一个对象
public record User(String name, int age, String remark, LocalDate birthDate) { }@Testvoid deserialize() {String json = """{"name": "John","age": 12,"remark": "This is a test","birthDate": "2020-01-01"}""";User user = JsonbBuilder.create().fromJson(json, User.class);System.out.println("user = " + user);}