版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/49998643
集成JAX-RS和JSON-P
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页: http://blog.csdn.net/chszs
一、JSON-P和JSON-B介绍
在Java EE 7中引入了JSON Processing API,即JSON-P规范。JSON-P规范定义了一套标准的API来操纵JSON数据,这一点与JAXP规范相似(操纵XML的API规范)。在Java EE 8中还将引入JSON Binding API,即JSON-B规范。
JSR 353: Java API for JSON Processing (JSON-P)规范详见
http://jcp.org/en/jsr/detail?id=353JSR 367: Java API for JSON Binding (JSON-B)规范详见
https://www.jcp.org/en/jsr/detail?id=367二、JAX-RS 2.0支持JSON-P
JAX-RS 2.0规范是Java EE 7规范的一部分,它同时也支持JSON-P规范,比如对JsonObject类、JsonArray类、JsonStructure类等提供了开箱即用的支持。每一个兼容JAX-RS 2.0规范的参考实现都提供了内建的支持以上类的实体Provider,使得JAX-RS应用程序可以轻松简单地交换JSON数据。
JsonObject见:
https://docs.oracle.com/javaee/7/api/javax/json/JsonObject.htmlJsonArray见:
https://docs.oracle.com/javaee/7/api/javax/json/JsonArray.htmlJsonStructure见:
https://docs.oracle.com/javaee/7/api/javax/json/JsonStructure.html三、例子
1、从JAX-RS资源方法发散JSON数组
@GET
public JsonArray buildJsonArray(){
return Json.createArrayBuilder().add("jsonp").add("jaxrs").build();
}
2、从客户端接收JSON数据
@POST
public void acceptJsonObject(JsonObject payload){
System.out.println("the payload -- "+ payload.toString());
}
3、JsonObject使用的例子
1)JSON数据如下
{
"firstName": "John", "lastName": "Smith", "age": 25,
"address" : {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
2)构建JsonObject
JsonObject value = Json.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("age", 25)
.add("address", Json.createObjectBuilder()
.add("streetAddress", "21 2nd Street")
.add("city", "New York")
.add("state", "NY")
.add("postalCode", "10021"))
.add("phoneNumber", Json.createArrayBuilder()
.add(Json.createObjectBuilder()
.add("type", "home")
.add("number", "212 555-1234"))
.add(Json.createObjectBuilder()
.add("type", "fax")
.add("number", "646 555-4567")))
.build();
四、值得注意的情况
1、无需编写自定义的MessageBodyReader类或MessageBodyWriter类的实现,正如前面提到的,JAX-RS规范提供了这些API。
2、使用注释绑定JSON方法的方式目前还不支持(类似于在POJOs类上使用JAXB注释),等未来的版本吧。GlassFish 4.1 (Jersey)和Wildfly 8.x (RESTEasy)已经支持了注释绑定JSON方法,但这种使用方式还不是标准,应注意这一点。
五、参考
1、官方JAX-RS规范:
https://jcp.org/aboutJava/communityprocess/final/jsr339/index.html