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アノテーションの付与が必要になる。






