jackson 如何让Java库用户在JSON解析框架之间进行选择?

zkure5ic  于 7个月前  发布在  Java
关注(0)|答案(2)|浏览(64)

我正在开发一个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-jsonbquarkus-resteasy-reactive-jackson,但它们没有POJO类来序列化。我可以提供我的库的三个模块,一个基础版本和JSON-BJackson的版本,但我无法在不复制/扩展大量类和依赖项的情况下完成它。

wnrlj8wa

wnrlj8wa1#

首先,值得注意的是,Jackson(通常)不需要@JsonProperty注解。尽管如此,根据被序列化的类,可能需要一些注解。在本例中,我只需要将两组注解都添加到数据类中--毕竟,如果不要求相应的框架处理该类,那么过多的注解也没有什么害处。
为此,您的maven模块需要在两个注解jar上声明一个依赖项。如果你担心你的客户端接收到不必要的注解jar,你可以声明你的依赖optional,这样它只在你的数据类编译期间使用,但在运行时不可用,除非你的用户自己声明一个依赖。注解JAR的缺失不会导致任何问题,因为Java运行时会忽略缺少定义的注解。

pdkcd3nj

pdkcd3nj2#

这个想法是,对于每个单独的JSON库模块,您必须开发一些通用代码,这些代码可以通过使用JSON库的API在给定的POJO和JSON之间进行序列化/重命名。
JSON库提供的注解方法只是处理JSON的高级方法。应该有一些方法可以在没有POJO和注解的情况下做同样的事情,并且在开发这些通用代码时,您应该检查每个JSON库如何做到这一点。例如,在Jackson中,您可以将JSON结构表示为Map而不是POJO
为了使POJO与任何JSON库无关,您还可以考虑定义自己的注解来注解POJO。然后,每个JSON模块中的那些通用代码可以利用它来做出决定。

相关问题