【Java】JacksonでJSONと遊ぶ(Javaのクラスから整形したJSON文字列を出力編)

Java

はじめに

前回まで

【Java】JacksonでJSONと遊ぶ(JSON to オブジェクト編)
JSONの操作を簡単に行うことができるライブラリであるJacksonを使って、さっとJSONからオブジェクトへの変換をするためのコード作成をしたものの共有です。
【Java】JacksonでJSONと遊ぶ(JavaのクラスからJSON編)
Jacksonを使って、オブジェクトからJSON形式の文字列を生成するコードの共有記事です。

今回の概要

以前の記事でオブジェクトからJSON文字列を出力する記事を書きましたが、こちらの記事のままJSON文字列を出力すると、出力結果が1行にまとまって表示されてしまいます。

それだと見づらいこともあるので、今回の記事ではJSON文字列を綺麗に出力する方法を紹介します。

開発環境

  • Windows10
  • Java11

冒頭で紹介した記事と同様の環境で実施しています。

ディレクトリ構成

  • JavaWorkspace
    • Jackson
      • lib
        • jackson-annotations-2.13.4-sources.jar
        • jackson-core-2.13.4-sources.jar
        • jackson-databind-2.13.4-sources.jar
      • JsonData2.java
      • ObjectToShapingJson.java

JSONに変換するためのデータクラス(JsonData2.java)と、オブジェクトからJSONに変換するためのクラス(ObjectToShapingJson.java)を用意しています。

Jacksonをつかうための準備

lib配下に格納しているjarのダウンロードが必要です。こちらは前回の記事に記載しているので、ダウンロードができていない場合(この記事から先に読んだ場合)、お手数ですが以下の記事を参照ください。

【Java】JacksonでJSONと遊ぶ(JSON to オブジェクト編)
JSONの操作を簡単に行うことができるライブラリであるJacksonを使って、さっとJSONからオブジェクトへの変換をするためのコード作成をしたものの共有です。

コード作成、実行

作ったコード

JsonData2.java

JSON ⇔ オブジェクトの変換をする際に使うオブジェクトクラスです。

import java.util.List;

class JsonData2 {
    public String name;
    public String note;
    public List<String> jobs;

    public JsonData2() {}
    public JsonData2(String name, String note, List<String> jobs) {
        this.name = name;
        this.note = note;
        this.jobs = jobs;
    }
}

前回までの記事で使っていた「JsonData.java」にList型のフィールドを追加しています。

ObjectToShapingJson.java

整形したJSON文字列を出力するためのクラスです。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.util.List;

public class ObjectToShapingJson {

    public static void main(String[] args) throws Exception {
        JsonData2 jd = createJsonData2();
        ObjectMapper mapper = new ObjectMapper();
        // ☆今回のポイント
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        String json = mapper.writeValueAsString(jd);

        System.out.println(json);
    }

    private static JsonData2 createJsonData2() {
        List<String> jobs = List.of("driver", "programmer");
        return new JsonData2("Sak", "Sample Json", jobs);
    }
}

mapper.enable(SerializationFeature.INDENT_OUTPUT)を使うことで、オブジェクトからJSON形式の文字列を生成できます。

簡単な説明(ObjectToShapingJson.java)

  • line 9:JSONに変換するためのデータを生成する
    • メソッドcreateJsonData2でデータを設定したオブジェクトを生成・返却
  • line 12:ObjectMapperのプロパティ「SerializationFeature.INDENT_OUTPUT」を有効化する。
  • line 16: 読み込んだデータを表示する

コンパイル~実行結果表示まで

コンパイル

javac -cp ".;lib/*" *.java

jarの読み込み、複数のjavaファイルの指定が必要なので、ワイルドカードを使って簡単に書きましょう。(以前の記事と同様の指定方法)

実行

java -cp ".;lib/*" ObjectToShapingJson

実行時にクラスパスの指定を忘れずに。

実行結果

{
  "name" : "Sak",
  "note" : "Sample Json",
  "jobs" : [ "driver", "programmer" ]
}

プロパティ毎(name, note, jobs)で改行された表示がされるようになりました。これを覚えておくと少しプロパティ数が多いJSONオブジェクトを文字列に変換しても、(少しは)見やすくなるかと思います。

ちなみに、「SerializationFeature.INDENT_OUTPUT」を有効化しない場合は、次のように出力されます。

{"name":"Sak","note":"Sample Json","jobs":["driver","programmer"]}

少しプロパティの区切りが見づらく、プロパティとデータのマッピングが掴みにくく感じます。まぁこれくらいの規模のデータならパッと読めちゃうかもしれませんが。

最後に

データ出力内容の読みやすさは仕事の進み具合にも露骨に影響するので、少しでも読みやすい方法での出力方法を知っておくのは助けになるのではないかと思います。

仮に、今回形式の出力が見づらいと感じたとしても、JavaでのJSON解析がやりにくいと思ったとしても。
「JSON文字列を整形できるんだ」ということを知っていれば、別言語で解析するにしても簡単に加工できるのかもという発想を得ることができると思います。

コメント

タイトルとURLをコピーしました