我正在开发一个Java库,它可以用来调用某个使用JSON数据格式传递信息的Web API。所述库将仅包含根据由API规范定义的数据结构的数据类。调用API所需的代码将被放置在第二个库中。
在Java企业应用程序中,有几个JSON解析库可用,如JSON-B或Jackson。我想把我的库设计成对底层JSON实现有点不可知。
让我们假设我的库有一个类Article
:
public class Article {
String id;
String headline;
String content;
}
为了使这个类适合在支持JSON-B的应用程序中使用,我必须为我的类提供以下注解,沿着一个项目依赖项,例如:jakarta.json.bind:jakarta.json.bind-api
:
public class Article {
@JsonbProperty("id")
String id;
@JsonbProperty("headline")
String headline;
@JsonbProperty("content")
String content;
}
为了使这个类适合在支持Jackson的应用程序中使用,我必须为我的类提供以下注解,沿着项目依赖项,例如:com.fasterxml.jackson.core:jackson-annotations
:
public class Article {
@JsonProperty("id")
String id;
@JsonProperty("headline")
String headline;
@JsonProperty("content")
String content;
}
我看到Quarkus的库为这两个框架提供了不同的版本,比如quarkus-resteasy-reactive-jsonb
和quarkus-resteasy-reactive-jackson
,但它们没有POJO类来序列化。我可以提供我的库的三个模块,一个基础版本和JSON-B和Jackson的版本,但我无法在不复制/扩展大量类和依赖项的情况下完成它。
2条答案
按热度按时间wnrlj8wa1#
首先,值得注意的是,Jackson(通常)不需要
@JsonProperty
注解。尽管如此,根据被序列化的类,可能需要一些注解。在本例中,我只需要将两组注解都添加到数据类中--毕竟,如果不要求相应的框架处理该类,那么过多的注解也没有什么害处。为此,您的maven模块需要在两个注解jar上声明一个依赖项。如果你担心你的客户端接收到不必要的注解jar,你可以声明你的依赖
optional
,这样它只在你的数据类编译期间使用,但在运行时不可用,除非你的用户自己声明一个依赖。注解JAR的缺失不会导致任何问题,因为Java运行时会忽略缺少定义的注解。pdkcd3nj2#
这个想法是,对于每个单独的JSON库模块,您必须开发一些通用代码,这些代码可以通过使用JSON库的API在给定的POJO和JSON之间进行序列化/重命名。
JSON库提供的注解方法只是处理JSON的高级方法。应该有一些方法可以在没有POJO和注解的情况下做同样的事情,并且在开发这些通用代码时,您应该检查每个JSON库如何做到这一点。例如,在Jackson中,您可以将JSON结构表示为Map而不是POJO
为了使POJO与任何JSON库无关,您还可以考虑定义自己的注解来注解POJO。然后,每个JSON模块中的那些通用代码可以利用它来做出决定。