在 JAX-RS 中解组 JSON 到 Java POJO
Unmarshal JSON to Java POJO in JAX-RS
我正在寻找每个 Json 格式调用的键和值,并将它们用作 java 对象,例如 String 或 Integer ,在休息客户端我会输入
{
"Name":"HelloWorld"
}
我会取回映射到它的键的 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;
}
首先您需要了解请求正文解析是如何完成的。在 JAX-RS 中,解析(或 unmarshalling/deserializing/whatever)是用 MessageBodyReader
完成的。有不同的 readers 可以处理不同的 Content-Type。例如,如果您有 Content-Type application/octet-stream
,则有一个 reader 将解组为 byte[]
或 File
或 InputStream
。所以下面将计算出盒子
@Consumes("application/octet-stream")
public Response post(File file) {} // or `byte[]` or `InputStream`
话虽这么说,JAX-RS 实现带有非常基本的 reader 用于“易于转换”的格式。例如,大多数请求都可以转换为 String
,因此您可以像使用当前代码一样免费获得大多数内容类型。
如果我们想要一些更复杂的数据类型,例如您的 HelloWorld
用于 Content-Type application/json
,则没有标准 reader。为此,我们需要创建自己的 reader 或使用 reader 附带的库。幸运的是,Java、Jackson 中最受欢迎的 JSON 库已经实现了一个具有 reader 和编写器(用于序列化)的 JAX-RS 提供程序。
现在,根据您使用的 server/JAX-RS 实现,不同的实现会围绕核心 Jackson JAX-RS 模块创建轻型包装器。如果我知道您正在使用的 JAX-RS 实现,我可以推荐使用哪个包装器,或者您可以忘记包装器而直接使用基本的 Jackson 模块,即
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.2.3</version>
</dependency>
以上是Maven依赖。如果你没有使用 Maven,那么基本上你需要下载所有这些 jar。
你可以找到所有这些 here。只需单独搜索它们。
然后您需要注册提供商。同样,这取决于您的 JAX-RS 实现以及您如何处理资源配置 类。我需要查看您的应用程序配置(web.xml 或 Java 代码),也许您正在使用的服务器可以提供帮助。大多数情况下,JacksonJsonProvider
(即 reader 和作者)需要注册。
注册后,您需要了解 Jackson 如何处理序列化的基础知识。在最多 basic 级别,Jackson 寻找 JavaBean properties(基本 getter/setter)以匹配 JSON 属性。例如,如果你有这个 bean 属性
public class HelloWorld {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
JSON 应该类似于 {"name": "whatever"}
。 "name"
键与 bean 属性 相同。在Bean 属性术语中,属性的名称是get/set
之后的所有字母,首字母小写。
这就是它的全部内容。现在你可以做
@Consumes("application/json")
public Response post(HelloWorld helloWorld) {
String name = helloWorld.getName(); // should == "whatever"
return Response.ok(helloWorld).build(); // we can also return objects
}
对于更复杂的 JSON 格式,您应该参考 Jackson 文档或在此处提问。
关于JacksonJsonProvider
的注册,如果遇到问题,请提供我要求的信息,即应用程序配置(web.xml或Java配置)和您正在使用的服务器。
另请参阅:
- JAX-RS Entity Provider 了解有关 reader 和作家的更多信息
我正在寻找每个 Json 格式调用的键和值,并将它们用作 java 对象,例如 String 或 Integer ,在休息客户端我会输入
{
"Name":"HelloWorld"
}
我会取回映射到它的键的 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;
}
首先您需要了解请求正文解析是如何完成的。在 JAX-RS 中,解析(或 unmarshalling/deserializing/whatever)是用 MessageBodyReader
完成的。有不同的 readers 可以处理不同的 Content-Type。例如,如果您有 Content-Type application/octet-stream
,则有一个 reader 将解组为 byte[]
或 File
或 InputStream
。所以下面将计算出盒子
@Consumes("application/octet-stream")
public Response post(File file) {} // or `byte[]` or `InputStream`
话虽这么说,JAX-RS 实现带有非常基本的 reader 用于“易于转换”的格式。例如,大多数请求都可以转换为 String
,因此您可以像使用当前代码一样免费获得大多数内容类型。
如果我们想要一些更复杂的数据类型,例如您的 HelloWorld
用于 Content-Type application/json
,则没有标准 reader。为此,我们需要创建自己的 reader 或使用 reader 附带的库。幸运的是,Java、Jackson 中最受欢迎的 JSON 库已经实现了一个具有 reader 和编写器(用于序列化)的 JAX-RS 提供程序。
现在,根据您使用的 server/JAX-RS 实现,不同的实现会围绕核心 Jackson JAX-RS 模块创建轻型包装器。如果我知道您正在使用的 JAX-RS 实现,我可以推荐使用哪个包装器,或者您可以忘记包装器而直接使用基本的 Jackson 模块,即
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.2.3</version>
</dependency>
以上是Maven依赖。如果你没有使用 Maven,那么基本上你需要下载所有这些 jar。
你可以找到所有这些 here。只需单独搜索它们。
然后您需要注册提供商。同样,这取决于您的 JAX-RS 实现以及您如何处理资源配置 类。我需要查看您的应用程序配置(web.xml 或 Java 代码),也许您正在使用的服务器可以提供帮助。大多数情况下,JacksonJsonProvider
(即 reader 和作者)需要注册。
注册后,您需要了解 Jackson 如何处理序列化的基础知识。在最多 basic 级别,Jackson 寻找 JavaBean properties(基本 getter/setter)以匹配 JSON 属性。例如,如果你有这个 bean 属性
public class HelloWorld {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
JSON 应该类似于 {"name": "whatever"}
。 "name"
键与 bean 属性 相同。在Bean 属性术语中,属性的名称是get/set
之后的所有字母,首字母小写。
这就是它的全部内容。现在你可以做
@Consumes("application/json")
public Response post(HelloWorld helloWorld) {
String name = helloWorld.getName(); // should == "whatever"
return Response.ok(helloWorld).build(); // we can also return objects
}
对于更复杂的 JSON 格式,您应该参考 Jackson 文档或在此处提问。
关于JacksonJsonProvider
的注册,如果遇到问题,请提供我要求的信息,即应用程序配置(web.xml或Java配置)和您正在使用的服务器。
另请参阅:
- JAX-RS Entity Provider 了解有关 reader 和作家的更多信息