ObjectMapperを利用することでJavaBeanオブジェクトとJSON文字列の変換を行うことができるが、変換を行うためには、その変換対象となる変数に、getter/setterメソッドが適切に設定するか、@JsonPropertyアノテーションの付与が必要になる。
今回は、getter/setterメソッドや@JsonPropertyアノテーションの設定内容をいろいろ変えて試してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。

サンプルプログラムの内容
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠のうち、「build.gradle」は今回変更したプログラムで、他は新規で作成したプログラムとなる。
「build.gradle」の内容は以下の通り。lombokとObjectMapperを利用できるような設定を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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アノテーションの内容を変えている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | 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オブジェクトに変換している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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アノテーションの付与が必要になる。