Javaその他

ObjectMapperを利用したJavaBeanオブジェクトとJSON文字列の変換をいろいろ試してみた

ObjectMapperを利用することでJavaBeanオブジェクトとJSON文字列の変換を行うことができるが、変換を行うためには、その変換対象となる変数に、getter/setterメソッドが適切に設定するか、@JsonPropertyアノテーションの付与が必要になる。

今回は、getter/setterメソッドや@JsonPropertyアノテーションの設定内容をいろいろ変えて試してみたので、そのサンプルプログラムを共有する。



前提条件

下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠のうち、「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アノテーションの付与が必要になる。