ObjectMapperを利用することでJavaBeanオブジェクトとJSON文字列の変換を行うことができるが、変換を行うためには、その変換対象となる変数に、getter/setterメソッドが適切に設定するか、@JsonPropertyアノテーションの付与が必要になる。
今回は、getter/setterメソッドや@JsonPropertyアノテーションの設定内容をいろいろ変えて試してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。
サンプルプログラムの内容
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠のうち、「build.gradle」は今回変更したプログラムで、他は新規で作成したプログラムとなる。
「build.gradle」の内容は以下の通り。lombokとObjectMapperを利用できるような設定を追加している。
plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' //lombokを利用するための設定 compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' //ObjectMapperを利用するための設定 compile 'com.fasterxml.jackson.core:jackson-databind:2.3.4' }
DemoFormオブジェクトの内容は以下の通り。各変数毎に、getter/setterメソッドの内容や@JsonPropertyアノテーションの内容を変えている。
package com.example.demo; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; import lombok.ToString; //toStringメソッドを自動設定するためのアノテーション @ToString public class DemoForm { /** * テスト変数1 */ // getter/setterメソッドをもつので、 // JSON文字列⇔JavaBeanオブジェクト(DemoForm)の変換ができる @Getter @Setter private String testVal1; /** * テスト変数2 */ // getter/setterメソッドをもたないので、 // JSON文字列⇔JavaBeanオブジェクト(DemoForm)の変換ができない private String testVal2; /** * テスト変数3 */ // getter/setterメソッドをもたないが、JsonPropertyアノテーションを // 含まないので、 JSON文字列⇔JavaBeanオブジェクト(DemoForm)の変換ができる @JsonProperty("testVal3") private String testVal3; /** * テスト変数4 */ // getter/setterメソッドを複数もつので、 // JavaBeanオブジェクトをJSON文字列に変換すると、2つの変数で作成される // また、JSON文字列⇔JavaBeanオブジェクト(DemoForm)の変換はできる @Getter @Setter private String testVal4; /** * テスト変数4を取得 * @return テスト変数4 */ public String getTestVal4Sub(){ return this.testVal4; } /** * テスト変数4を設定 * @param testVal4 テスト変数4 */ public void setTestVal4Sub(String testVal4){ this.testVal4 = testVal4; } /** * コンストラクタ(引数なし) */ // JSON文字列をJavaBeanオブジェクト(DemoForm)に変換するには、 // 引数をもたないコンストラクタが必要 public DemoForm(){} /** * コンストラクタ(引数あり) * @param testVal1 テスト変数1 * @param testVal2 テスト変数2 * @param testVal3 テスト変数3 * @param testVal4 テスト変数4 */ public DemoForm(String testVal1, String testVal2, String testVal3, String testVal4){ this.testVal1 = testVal1; this.testVal2 = testVal2; this.testVal3 = testVal3; this.testVal4 = testVal4; } }
DemoMainクラスの内容は以下の通り。ObjectMapperクラスのwriteValueAsStringメソッドで、JavaBeanオブジェクトをJSON文字列に変換し、ObjectMapperクラスのreadValueメソッドで、JSON文字列をJavaBeanオブジェクトに変換している。
package com.example.demo; import com.fasterxml.jackson.databind.ObjectMapper; public class DemoMain { public static void main(String[] args){ // JavaBeanオブジェクト(TestForm)を生成する DemoForm testForm = new DemoForm("テスト変数1", "テスト変数2" , "テスト変数3", "テスト変数4"); System.out.println("変換前TestForm : " + testForm.toString()); // JavaBeanオブジェクトとJSONで変換するObjectMapperを生成する ObjectMapper objectMapper = new ObjectMapper(); try{ // JavaBeanオブジェクト(DemoForm)をJSON文字列に変換する String jsonStr = objectMapper.writeValueAsString(testForm); System.out.println("変換後JSON : " + jsonStr); // JSON文字列をJavaBeanオブジェクト(DemoForm)に変換する DemoForm afterTestForm = objectMapper.readValue(jsonStr, DemoForm.class); System.out.println("変換後DemoForm : " + afterTestForm.toString()); }catch (Exception e){ System.err.println(e); } } }
サンプルプログラムの実行結果
getter/setterメソッドのないテスト変数2については、「変換後JSON」の出力が無く、「変換後DemoForm」の設定値がnullになっている。また、複数のgetter/setterメソッドをもつテスト変数4については、「変換後JSON」でtestVal4とtestVal4Subの2種類の出力がされている。
さらに、getter/setterメソッドがあるテスト変数1、@JsonPropertyアノテーションがあるテスト変数3については、「変換後JSON」に出力され、その設定値が「変換後DemoForm」に設定されることが確認できる。
要点まとめ
- ObjectMapperを利用することでJavaBeanオブジェクトとJSON文字列の変換を行うことができるが、その変換対象となる変数に、getter/setterメソッドが適切に設定するか、@JsonPropertyアノテーションの付与が必要になる。