0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Spring BootでJSONを整形してログ出力する

Last updated at Posted at 2021-12-04

はじめに

Spring Bootを用いたREST APIの動作確認でリクエスト・レスポンスのJSONを整形した状態でログ出力したくなった。
logback.xmlの設定でログ全体をJSONとして整形・出力する方法はすぐに見つかったが、パラメータのJSONのみ整形する方法になかなか辿り着けなかったためメモ。

サンプルプロジェクト

  • spring initializerで作成。
  • Spring Boot : 2.6.1
  • spring-boot-starter-web, lombok を使用

解決策

ObjectMapperのインスタンス生成時にSerializationFeature.INDENT_OUTPUTを設定し、オブジェクトをJSONに変換する。

実装

動作確認したサンプルを以下に記載します。

モデルクラス

TestModel.java
package com.example.demo;

import lombok.Data;

@Data
public class TestModel {

    private int id;
    private String name;
    private int age;
}

コントローラ

Controller.java
package com.example.demo;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

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

import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping("/test")
@Slf4j
public class Controller {

    @GetMapping("/prettyjson")
    @ResponseStatus(HttpStatus.OK)
    public String prettyjson() {

        TestModel model = new TestModel();
        model.setId(1);
        model.setName("Ken");
        model.setAge(20);

        // インスタンス生成時に SerializationFeature.INDENT_OUTPUT を設定することで整形される
        ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

        String json = "";

        try {
            json = mapper.writeValueAsString(model);
            log.info(json);
        } catch (JsonProcessingException e) {
            log.error(e.getMessage());
        }
        return json;
    }
}

動作確認

curlでリクエストを投げてみる。

curl localhost:8080/test/prettyjson

出力結果(curl)

{
  "id" : 1,
  "name" : "Ken",
  "age" : 20
}

出力結果(ログ)

2021-12-04 18:06:40.208  INFO 21036 --- [io-8080-exec-1] com.example.demo.Controller              : {
  "id" : 1,
  "name" : "Ken",
  "age" : 20
}

期待通りの結果が得られました!

おわりに

REST APIの開発は今回が初めてだったんですが、JSONの整形出力ってpretty-printと言うんですね。。。
はじめて知りました(笑)
検索ワードで pretty print を使っていればもっと早く参考資料にたどり着けたはず。

参考資料

ちょっとしたTips集 - JSONを PrettyPrint で出力する設定

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?