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 コンテンツが応答で戻されます。
{"greeting":"Hello John Doe"}