在JAX-RS中将JSON解组为Java POJO

时间:2015-08-13 14:06:32

标签: java json rest jax-rs

我希望得到每个Json格式化调用的键和值,并将它们用作java对象,如String或Integer,在我将输入的rest客户端中 { "名称":"的HelloWorld" }

我会回到映射到它的Key的HelloWorld到目前为止我见过的例子但是我很难找出每个标签的作用以及如何解析身体以得到上述结果

@POST
    @Path("/SetFeeds")
    @Consumes(MediaType.APPLICATION_JSON)   
    @Produces(MediaType.APPLICATION_JSON) 
    @JsonCreator

        public String setFeed(String jsonBody,@Context UriInfo uriInfo){        
...Code to manipulate the body of the request 
            return response;

    } 

1 个答案:

答案 0 :(得分:21)

您需要了解的第一件事是如何完成请求正文解析。在JAX-RS中,使用MessageBodyReader进行解析(或解组/反序列化/其他)。有不同的读者可以处理不同的Content-Type。例如,如果您有内容类型application/octet-stream,则有一个阅读器可以解组为byte[]FileInputStream。所以下面的方法可以解决方案

@Consumes("application/octet-stream")
public Response post(File file) {}  // or `byte[]` or `InputStream`

话虽这么说,JAX-RS的实现配备了非常基本的读卡器,可轻松转换"格式。例如,大多数请求都可以转换为String,因此您可以像使用当前代码一样免费获得大多数内容类型。

如果我们想要一些更复杂的数据类型,例如内容类型HelloWorld的{​​{1}},则没有标准的阅读器。为此,我们要么需要创建自己的阅读器,要么使用阅读器附带的库。幸运的是,Java中最流行的JSON框架Jackson已经实现了一个JAX-RS提供程序,它具有读取器和编写器(用于序列化)。

现在,根据您使用的服务器/ JAX-RS实现,不同的实现会在核心Jackson JAX-RS模块周围创建光包装器。如果我知道您正在使用的JAX-RS实现,我可以推荐使用哪个包装器,或者您可以忘记包装器并使用基本的Jackson模块,这是

application/json

以上是Maven依赖。如果您不使用Maven,那么基本上您需要下载所有这些罐子。

jackson deps

你可以找到所有这些here。只需单独搜索它们。

然后您需要注册提供者。同样,这取决于您的JAX-RS实现以及如何处理资源类的配置。我需要查看您的应用程序配置(web.xml或Java代码)以及您正在使用的服务器来帮助解决这个问题。在大多数情况下,<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.2.3</version> </dependency> (读者和作者)需要注册。

一旦你注册了它,你就需要了解杰克逊如何处理序列化的基础知识。最多 basic 级别,Jackson会查找JavaBean properties(基本getter / setter)以匹配JSON属性。例如,如果你有这个bean属性

JacksonJsonProvider

JSON应该看起来像public class HelloWorld { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } {"name": "whatever"}键与bean属性相同。在Bean属性术语中,属性的名称是"name"之后的所有字母,第一个字母小写。

这几乎就是它的全部内容。现在你可以做到

get/set

对于更复杂的JSON格式,您应该参考Jackson文档或在SO上提出问题。

就注册@Consumes("application/json") public Response post(HelloWorld helloWorld) { String name = helloWorld.getName(); // should == "whatever" return Response.ok(helloWorld).build(); // we can also return objects } 而言,如果遇到问题,请提供我要求的信息,即应用程序配置(web.xml或Java配置)和您正在使用的服务器。

另见: