Plain Old Java™ Object (POJO) による Jackson の使用
RESTful サービスでは、Jackson ライブラリーを使用して JavaScript Object Notation (JSON) 形式のコンテンツを取り込んだり、生成したりすることができます。
このタスクについて
POJO タイプ (配列タイプと java.util.Collection タイプを含む) は Jackson 対応エンティティー・タイプです。 Jackson ライブラリーは、本製品のランタイム環境に含まれています。 追加のライブラリー を組み込む必要はありません。
以下の Jackson アノテーションがサポートされていて、POJO のアノテーション付けに使用できます。
org.codehaus.jackson.annotate.JsonAnySetter
org.codehaus.jackson.annotate.JsonAutoDetect
org.codehaus.jackson.annotate.JsonClass
org.codehaus.jackson.annotate.JsonContentClass
org.codehaus.jackson.annotate.JsonCreator
org.codehaus.jackson.annotate.JsonGetter
org.codehaus.jackson.annotate.JsonIgnore
org.codehaus.jackson.annotate.JsonIgnoreProperties
org.codehaus.jackson.annotate.JsonKeyClass
org.codehaus.jackson.annotate.JsonProperty
org.codehaus.jackson.annotate.JsonPropertyOrder
org.codehaus.jackson.annotate.JsonSetter
org.codehaus.jackson.annotate.JsonSubTypes
org.codehaus.jackson.annotate.JsonSubTypes.Type
org.codehaus.jackson.annotate.JsonTypeInfo
org.codehaus.jackson.annotate.JsonTypeName
org.codehaus.jackson.annotate.JsonValue
org.codehaus.jackson.annotate.JsonWriteNullProperties
org.codehaus.jackson.map.annotate.JsonCachable
org.codehaus.jackson.map.annotate.JsonDeserialize
org.codehaus.jackson.map.annotate.JsonSerialize
org.codehaus.jackson.map.annotate.JsonTypeIdResolver
org.codehaus.jackson.map.annotate.JsonTypeResolver
org.codehaus.jackson.map.annotate.JsonViewこうしたアノテーションは、POJO を JSON との間で変換する方法をより細かく制御するために使用できます。
手順
- POJO をリソース・メソッドのパラメーターまたは戻りの型として使用します。
- アプリケーションまたは JSON メディア・タイプを指定した
javax.ws.rs.core.Producesまたはjavax.ws.rs.core.Consumesアノテーションをリソース・メソッドに追加します。
結果
Jackson を使用して JSON データを POJO との間でアンマーシャルまたはマーシャルできるリソースを実装しました。
例
以下の例は、人の集合を戻すためのリソースと、人に対する挨拶文を処理するために使用されるリソースを示しています。
public class Person {
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}public class Greeting {
private String greeting;
public String getGreeting() {
return this.greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}import java.util.List;
import java.util.ArrayList;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/people")
public class JacksonResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Person> getPersonList() {
List<Person> personArray = new ArrayList<Person>();
Person firstPerson = new Person();
firstPerson.setFirstName("John");
firstPerson.setLastName("Doe");
personArray.add(firstPerson);
Person secondPerson = new Person();
secondPerson.setFirstName("Fred");
secondPerson.setLastName("Thompson");
personArray.add(secondPerson);
return personArray;
}
@Path("/greet")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Greeting createGreetingForPerson(Person person) {
String name = person.getFirstName() + " " + person.getLastName();
Greeting greeting = new Greeting();
greeting.setGreeting("Hello " + name);
return greeting;
}
}GET 要求を JacksonResource リソースに対して発行すると、以下のコード・スニペットのように JSON コンテンツが応答で戻されます。
[{"firstName":"John","lastName":"Doe"},{"firstName":"Fred","lastName":"Thompson"}]POST 要求を JacksonResource に対して発行すると、以下のコード・スニペットのように JSON コンテンツが要求として送信され、Person オブジェクトに格納されます。
{"firstName":"John","lastName":"Doe"}
JSON content, like the following code snippet, is returned in the response.
{"greeting":"Hello John Doe"}