由于RFC 7159 ,字符串可以是有效的 JSON 文档:
JSON-text = ws value ws
...
value = false / null / true / object / array / number / string
...
string = quotation-mark *char quotation-mark
因此,一个有效的 JSON 可以是“Hello World”
。
是否可以使用 JAX-RS 使用这样的 JSON 字符串?
最佳答案
JAX-RS 有一个 @Consumes
注释来指定资源可以使用的由客户端发送的表示的 MIME 媒体类型。
以下是接受媒体类型为 application/json
的请求的示例:
@Path("/foo")
public class FooResource {
@POST
@Consumes("application/json")
public Response bar(InputStream entity) {
return Response.ok.build();
}
}
如果您发送一个 header 为 Content-Type: application/json
的请求,将返回一个状态为 200 OK
的响应。但是,如果您发送带有 Content-Type: application/xml
header 的请求,将返回带有 406 Not Acceptable
的响应。这是因为 @Consumes
指定可以接受带有 JSON 的请求,但不接受其他请求。
您可以观察到 @Consumes
记录了如何解析请求实体,但指定了应该接受的媒体类型。
可以看到上面的例子有一个InputStream实体
的参数。它实际上是请求实体。您可以使用 JSON 解析器库在 bar
的资源方法中进行解析,例如Jackson :
@POST
@Consumes("application/json")
public Response bar(InputStream entity) {
ObjectMapper mapper = new ObjectMapper();
String json = mapper.readValue(inputStream, String.class);
System.out.println(json);
return Response.ok.build();
}
如果您发送带有“Hello World”正文的请求,您将在控制台中看到“Hello World”。这是因为 Jackson
知道如何解析 RFC 7159 中指定的 JSON 文档,但不知道 JAX-RS。
事实上,像 RESTEasy 这样的 JAX-RS 实现已经有了流行的 JSON 解析器库对 JSON 的支持。因此,您可以简单地创建一个资源方法,如下所示:
@POST
@Consumes("application/json")
public Response bar(String json) {
System.out.println(json);
return Response.ok.build();
}
你应该得到相同的结果。
在幕后,JAX-RS 有 MessageBodyReader将 HTTP 请求主体转换为 Java 对象。它是提供从表示到相应 Java 类型的映射服务的类。例如,jackson-jaxrs-providers为 JSON 数据格式实现 JAX-RS MessageBodyReader
和 MessageBodyWriter
处理程序。
关于JAX-RS的更多细节,可以查看JSR-000339 JAX-RS 2.0 Specification
关于java - 使用 JAX-RS 使用 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38125756/