本文へスキップ
BecomeCoder

Spring / Spring Bootコース · 第4章 Web ― REST APIを作る · レッスン14

リクエストとレスポンスの往復 ― JSONへの自動変換

ローカル実施

導入

レッスン12で「メソッドがオブジェクトを返すと、そのままJSONになる」と説明しました。文字通り「そのまま」で本当に大丈夫なのでしょうか。裏側で何が起きているのかを見ておきましょう。

説明

@RestController のメソッドがJavaオブジェクトを返すと、Springは内部で Jackson というライブラリを使い、オブジェクトのフィールドをJSONのキーと値に変換します。

class User {
    private Long id;
    private String name;
    private String email;
    // コンストラクタ・getterは省略
}
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
    return userService.findById(id); // User オブジェクトを返すだけ
}
// 実際にクライアントへ返るレスポンス
{
  "id": 5,
  "name": "山田太郎",
  "email": "yamada@example.com"
}

この変換を行っているのが HttpMessageConverter という仕組みです。spring-boot-starter-web にはJacksonがあらかじめ組み込まれているため、開発者は変換処理を一切書かずに済みます。

sequenceDiagram
    participant Client as クライアント
    participant Ctrl as Controller
    participant Jackson as Jackson(JSON変換)
    Client->>Ctrl: GET /api/users/5
    Ctrl->>Ctrl: User オブジェクトを組み立てる
    Ctrl-->>Jackson: User オブジェクトを渡す
    Jackson-->>Client: JSON文字列に変換して返す

逆方向(クライアントが送ったJSONをJavaオブジェクトに変換する)も同じ仕組みで行われます。これは次のレッスンで扱う @RequestBody の役割です。「JavaオブジェクトとJSONの変換は、意識しなくても勝手に行われている」——このことを知っておくだけで、Springのコード中に見当たらない変換処理を探して迷うことがなくなります。

やってみよう

User クラスpassword フィールドを足したとします。このままではAPIのレスポンスに password の値までJSONとして含まれてしまいます。この問題をどう防げばよさそうか考えてみましょう(次のレッスンの「DTOを分ける」という発想のヒントになります)。