Jersey、JAXB、JAX-RS、Moxy、Jackson、EclipseLink Moxy、json和xml之间有什么关系?

20
我来自Node.js背景,对RESTful Web服务有相当好的理解。
现在,我尝试使用Java构建RESTful Web服务。我了解核心Java知识,但完全不熟悉基于Java的Web开发。
经过一些教程的学习,我得出结论需要使用Jersey框架构建我的RESTful API。我了解Jersey是JAX-RS的某种参考实现。
但我无法理解其他术语和组件(如JAXB、Jackson、EclipseLink Moxy、jersey-media-moxy、Jettison、JSON-P JSON、XML等)之间的关系。我只能得出一个结论,即将Java对象转换为XML或JSON等价物并不像JavaScript那么简单。
我的问题是,如果我正在开发基于Java的RESTful API,这些术语之间的关系是什么,它们如何配合使用?
1个回答

48

Java世界中术语确实很多,对于新开发人员来说这可能会造成重大的学习曲线。使用Java传递JSON或XML文档并不是特别困难,只是多年来需要使用的各种组件已经衍生出了术语。下面是我对您提到的术语的理解列表...

XML - 您知道XML是什么吧?可扩展标记语言。在JSON成为主流之前,这就是我们所拥有的。

JSON - 哦,JSON是新的主流。它是一种人类可读的对象序列化格式,比XML更简洁。现在非常流行。它是新的灵丹妙药,能够解决所有问题...

JAXB - 在Java生态系统中,“Java Architecture for XML Binding”是将XML数据转换为您可以进行交互的对象的主要机制,反之亦然。重要的是要意识到它是一个API而不是一个实现,因此它主要定义了javax.xml.bind包中的一组注释和简单类/接口。要使用JAXB进行任何有用的操作,您需要一个实现。Glassfish应用服务器中包含有参考实现。大多数应用服务器都会有一些JAXB的实现。

Jackson - 数据绑定的库。它支持XML和JSON作为文档格式,并实现了JAXB API。您可以将Jackson用作JAXB的实现,也可以直接使用Jackson API。

EclipseLink Moxy - JAXB API的另一种实现方式。像Jackson一样,它也有自己的API。您可以选择使用它或不使用。您可能不想同时使用Jackson和Moxy。

Jersey-media-moxy - 如您所提到的,Jersey是JAX-RS的一个实现。 JAX-RS 的一个方面是传递文档 - 通常是XML或JSON。为此,Jersey需要知道使用哪个基础库来进行数据绑定或流处理。因此,jersey-media-moxy作为一种jersey插件依赖项存在,您可以使用它来配置Jersey以使用Moxy进行对象序列化。对于使用jackson的等效程序包,也有类似的包名为jersey-media-json-jackson。

Jettison - 又一个用于将Java对象转换为Json的序列化库。

JSON-P - 一种用于处理JSON的API,可以将其作为事件流或通过数据绑定到对象进行处理。该API仍在开发中。您可能会问如何做json处理而不使用它-答案是他们要么利用专有库API(例如Jackson或Moxy),要么使用将JAXB API重新配置为与JSON一起工作的库(Jackson肯定可以,我不确定Moxy是否可以)。JSON-P将使直接使用JSON功能更加容易,而无需使用JAXB带来的所有XML概念。


在解释JAXB时,您提到了“API而不是实现”,这有什么区别? API是应用程序编程接口,其中您有一些实现,并且其他程序可以使用它。那么它与实现有何不同之处?我和OP一样,是Java Web开发世界的新手。请启迪我们。谢谢。 - sofs1
几分钟后...我读到了这句话:“Jersey-media-moxy - 正如你所提到的,Jersey是JAX-RS的一个实现” - 由于Jersey是JAX-RS的一个实现,那么JAX-RS是一个API(即一些简单的类/接口)吗? - sofs1
3
API本身仅仅是一项规范,意味着接口被创建用于定义程序应该遵循的规则,以便利用API预期的功能。因此你的理解是正确的,JAX-RS是一个API,而Jersey(还有RESTEasy和Apache CXF)是该规范的实现。 - Brent Sharrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接