カテゴリ: Micronaut 更新日: 2026/03/25

MicronautでJSONレスポンスを返す方法!自動シリアライズの基本を初心者向けに解説

MicronautでJSONレスポンスを返す方法!自動シリアライズの基本
MicronautでJSONレスポンスを返す方法!自動シリアライズの基本

先生と生徒の会話形式で理解しよう

生徒

「Micronautを使ってWebAPIを作りたいのですが、JavaのオブジェクトをJSON形式でブラウザに返すにはどうすればいいですか?」

先生

「Micronautには『自動シリアライズ』という非常に便利な機能があります。特別な変換コードを書かなくても、クラスをそのまま返すだけで自動的にJSONに変換してくれるんですよ。」

生徒

「えっ、勝手にJSONにしてくれるんですか?難しい設定が必要そうですが…。」

先生

「実はアノテーションを一つ付けるだけで準備完了です。その具体的な仕組みと書き方を詳しく見ていきましょう!」

1. JSONレスポンスとシリアライズの重要性

1. JSONレスポンスとシリアライズの重要性
1. JSONレスポンスとシリアライズの重要性

現代のシステム開発において、WebAPI(ウェブエーピーアイ)がデータをやり取りする標準的な形式はJSON(ジェイソン)です。JSONは人間にも読みやすく、プログラムにとっても解析しやすいテキスト形式のデータ表現です。一方で、Javaのプログラム内ではデータは「オブジェクト」として扱われています。

このJavaのオブジェクトをJSONというテキストデータに変換する工程を「シリアライズ」と呼びます。Micronaut(マイクロノート)というJavaフレームワークは、このシリアライズを非常に効率的、かつ自動的に行ってくれるため、開発者はデータの変換処理を意識することなく、ビジネスロジックの開発に集中できるのが大きなメリットです。クラウドネイティブなアプリ開発では、この手軽さが開発スピードを大きく左右します。

2. POJOクラスの作成とIntrospectedアノテーション

2. POJOクラスの作成とIntrospectedアノテーション
2. POJOクラスの作成とIntrospectedアノテーション

MicronautでJSONを返すためには、まずデータを保持するためのシンプルなクラスを作成します。これを一般的にPOJO(ポジョ)と呼びます。ここで最も重要なのが、クラスの先頭に @Introspected というアノテーションを付けることです。

Micronautは、アプリを動かす前にコンパイルの段階でクラスの情報を解析します。このアノテーションを付けることで、「このクラスはJSONへの変換に使いますよ」とMicronautに教えることができ、実行時に高速な処理が可能になります。Javaの標準的な書き方に則って、フィールド、ゲッター、セッターを用意するだけで準備は完了です。以下のコードは、商品情報を表すシンプルなクラスの例です。


package com.example;

import io.micronaut.core.annotation.Introspected;

@Introspected
public class Product {
    private String name;
    private int price;

    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getPrice() { return price; }
    public void setPrice(int price) { this.price = price; }
}

3. コントローラーからオブジェクトを返却する

3. コントローラーからオブジェクトを返却する
3. コントローラーからオブジェクトを返却する

クラスの準備ができたら、次はリクエストを受け取る「コントローラー」を作成します。Micronautのコントローラー内で、先ほど作成したオブジェクトをメソッドの戻り値として指定するだけで、自動的にJSONレスポンスが生成されます。

通常、他のフレームワークではJSONに変換するためのライブラリを明示的に呼び出す必要がありますが、Micronautでは「return オブジェクト名;」と書くだけで背後のエンジンが自動で変換作業を完結させます。これにより、コードの見通しが非常に良くなり、初心者でも迷わずに実装を進めることができます。以下の例では、特定の商品情報を返すAPIを作成しています。


package com.example;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/products")
public class ProductController {

    @Get("/single")
    public Product getProduct() {
        // オブジェクトを作ってそのまま返すだけ!
        return new Product("美味しいリンゴ", 200);
    }
}

このコントローラーを動かしてアクセスすると、以下のような結果が自動的にブラウザやツールに表示されます。


{
  "name": "美味しいリンゴ",
  "price": 200
}

4. 自動シリアライズが動作する仕組み

4. 自動シリアライズが動作する仕組み
4. 自動シリアライズが動作する仕組み

なぜ、ただオブジェクトを返すだけでJSONに変換されるのでしょうか。それはMicronautがデフォルトで「Jackson(ジャクソン)」という高性能なJSON処理ライブラリを内蔵しているからです。リクエストが届き、メソッドが実行された後、Micronautは戻り値の型を確認します。

戻り値がStringや数値ではない場合、Micronautは「これは構造化されたデータだ」と判断し、シリアライズ処理を開始します。このとき、ゲッターメソッド(getNameなど)の名前を元にして、JSONのキー("name"など)を自動生成します。この一連の流れがノンブロッキングで高速に実行されるため、非常に高いパフォーマンスを発揮します。初心者の方は、とりあえず「ゲッターを正しく作ればJSONになる」と覚えておけば間違いありません。

5. リストやマップなどのコレクションを返す

5. リストやマップなどのコレクションを返す
5. リストやマップなどのコレクションを返す

実際の開発では、一つのデータだけでなく、データの「一覧」を返したい場面も多いでしょう。Micronautの自動シリアライズは、Javaの ListMap といったコレクションクラスにも完全に対応しています。

例えば、複数のユーザー情報をリストに詰めて返却すると、JSON側では [ { ... }, { ... } ] という配列形式に自動で変換されます。これを活用すれば、検索結果の一覧表示やランキング機能なども簡単に実装できます。複雑なデータのネスト(入れ子構造)があっても、Micronautが階層を辿って適切に処理してくれます。次のコードでは、複数のメッセージを一気に返す例を見てみましょう。


package com.example;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import java.util.Arrays;
import java.util.List;

@Controller("/messages")
public class MessageController {

    @Get("/list")
    public List<String> getMessages() {
        // リストを返せば、自動的にJSONの配列形式になります
        return Arrays.asList("おはよう", "こんにちは", "こんばんは");
    }
}

[
  "おはよう",
  "こんにちは",
  "こんばんは"
]

6. JSONのキー名をカスタマイズする方法

6. JSONのキー名をカスタマイズする方法
6. JSONのキー名をカスタマイズする方法

Javaの変数名と、外部に公開するJSONのキー名を別のものにしたい場合があります。例えば、Javaでは userName と書いているけれど、JSONでは user_name とスネークケースで出力したいといった要望です。Micronautでは、これもアノテーション一つで制御可能です。

@JsonProperty というアノテーションをフィールドやゲッターに付けることで、JSON出力時の名前を明示的に指定できます。これにより、既存のシステムとのデータ連携や、特定の命名規約に従わなければならないプロジェクトでも柔軟に対応できるようになります。細かい調整ができる点も、Micronautがプロフェッショナルな現場で選ばれる理由です。

7. 日付データのフォーマット指定

7. 日付データのフォーマット指定
7. 日付データのフォーマット指定

JSONで扱うデータの中で、初心者が特につまずきやすいのが「日付」です。Javaの LocalDateTime などをそのまま返すと、数字の羅列になってしまったり、意図しない形式で表示されたりすることがあります。これを解決するのがフォーマット指定です。

アノテーションを利用して「yyyy-MM-dd」といった形式を指定することで、人間が見て分かりやすい日付形式でJSONを返せるようになります。Micronautの設定ファイル(application.yml)でアプリ全体のデフォルト形式を決めることも可能ですが、特定の項目だけ個別に指定できる柔軟性も備わっています。以下のコードは、注文日を綺麗にフォーマットして返す例です。


package com.example;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.micronaut.core.annotation.Introspected;
import java.time.LocalDateTime;

@Introspected
public class Order {
    private String orderId;
    
    // 日付の形を指定します
    @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")
    private LocalDateTime orderTime;

    public Order(String orderId, LocalDateTime orderTime) {
        this.orderId = orderId;
        this.orderTime = orderTime;
    }

    public String getOrderId() { return orderId; }
    public LocalDateTime getOrderTime() { return orderTime; }
}

8. エラー時のJSONレスポンス制御

8. エラー時のJSONレスポンス制御
8. エラー時のJSONレスポンス制御

API開発では、正常なデータだけでなく、エラーが起きた際にもJSONを返す必要があります。例えば「指定されたデータが見つからない」場合に、エラーコードとメッセージを詰め込んだJSONを返すのが親切な設計です。Micronautでは HttpResponse クラスを使い、ステータスコードと共にオブジェクトを返却できます。

エラー情報をまとめた専用のクラスを用意しておけば、例外が発生した際にも一貫した形式のJSONをクライアントに届けることができます。プログラムのどこでエラーが起きても、呼び出し側に「何が悪かったのか」を構造化されたデータで伝えることで、フロントエンドの開発がスムーズに進むようになります。APIの品質を高めるためにも重要なテクニックです。

9. 不要な項目をJSONに含めない設定

9. 不要な項目をJSONに含めない設定
9. 不要な項目をJSONに含めない設定

Javaのクラスには存在するけれど、外部には見せたくない機密情報(パスワードや内部用IDなど)がある場合、それらをJSONから除外する必要があります。これを実現するのが @JsonIgnore アノテーションです。

この印を付けた項目は、シリアライズの対象から外されるため、誤って重要な情報をネット上に流出させてしまうリスクを減らすことができます。また、値が null の項目を表示したくない場合には、クラス全体に「nullなら無視する」という設定を付けることも可能です。これにより、JSONのデータ量を削減し、通信の効率化を図ることもできます。セキュリティとパフォーマンス、両方の面で役立つ機能です。

10. レコード型(record)を利用した最新の書き方

10. レコード型(record)を利用した最新の書き方
10. レコード型(record)を利用した最新の書き方

Java 14から導入された「レコード型(record)」を使用すると、さらにコードを短縮できます。レコード型は、データを保持するためだけに作られた特別なクラスの書き方で、ゲッターやセッターを自分で書く必要がありません。Micronautはこの最新のJava機能にも完全に対応しています。

レコード型を使えば、数行の記述だけでJSONレスポンス用のデータ構造を定義できます。特に最近のMicronautプロジェクトでは、このrecordを積極的に使うことで、ボイラープレート(お決まりの退屈なコード)を徹底的に排除するのがトレンドです。初心者の方は、まずはこの最新かつシンプルな書き方をマスターすることをお勧めします。コードが短ければ短いほど、バグが入り込む余地も少なくなり、メンテナンスも楽になります。

関連記事:
カテゴリの一覧へ
新着記事
New1
Micronaut
Micronautの@Factoryとは?複雑なBean生成を管理するための方法を解説
New2
Quarkus
QuarkusのDIとCDIを完全理解!@Producesでプロデューサーメソッドを使う方法を初心者向けに解説
New3
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
New4
Micronaut
Micronautで非同期HTTP処理を行う方法!リアクティブ対応の基礎知識
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.4
Java&Spring記事人気No4
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.5
Java&Spring記事人気No5
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.6
Java&Spring記事人気No6
Java
Java Optional ifPresentの使い方を徹底解説!nullチェックをスマートに省略する方法
No.7
Java&Spring記事人気No7
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.8
Java&Spring記事人気No8
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?