天天看點

內建JAX-RS和JSON-P內建JAX-RS和JSON-P

版權聲明:本文為部落客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=353

JSR 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.html

JsonArray見:

https://docs.oracle.com/javaee/7/api/javax/json/JsonArray.html

JsonStructure見:

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