1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
コース一覧
Spring Boot入門
JSONとオブジェクトの往復

Spring Boot入門

Java で Web API サーバーを作るための Spring Boot の入門コースです。DI コンテナ、REST コントローラ、リクエスト検証、レイヤ分割、Spring Data JPA、例外ハンドリング、テストまでを扱います。毎レッスン、Spring が裏側でやっている判断そのものを pure Java の関数として自分で書き、フレームワークが何を肩代わりしてくれているのかを手触りで理解できる構成にしました。約 12 時間 (1 日 30 分 × 24 日) で 48 レッスンを修了できます。

1
Spring Bootとは何か
01. Spring Bootで何が作れるのか10分
02. サーブレットからフレームワークへ15分
03. ルーティング表という発想15分
04. プロジェクトの構成10分
05. 起動のしくみと自動設定15分
06. パスのマッチング15分
2
DIコンテナ
01. newで書くと何が困るのか15分
02. コンストラクタインジェクション15分
03. インターフェースへの依存15分
04. @Componentと@Bean15分
05. 自作のDIコンテナ20分
06. Beanのスコープとライフサイクル15分
3
RESTコントローラ
01. RESTという設計方針15分
02. @RestControllerの役割15分
03. @GetMappingとパス変数15分
04. クエリパラメータの受け取り15分
05. @PostMappingとリクエストボディ15分
06. ステータスコードの選び方15分
07. ResponseEntityで組み立てる15分
4
リクエストとレスポンスの変換
01. JSONとオブジェクトの往復15分
02. DTOとエンティティを分ける15分
03. recordでDTOを書く15分
04. 入力検証の基本15分
05. 検証エラーをまとめて返す15分
06. アノテーションによる検証15分
5
レイヤ構成とビジネスロジック
01. 3層アーキテクチャ10分
02. @Serviceに置くもの15分
03. 状態遷移をルールにする15分
04. 料金計算のような業務ロジック15分
05. @Transactionalとは何か15分
06. トランザクションの巻き戻し15分
6
データアクセス
01. @Entityとテーブルの対応15分
02. リポジトリという抽象15分
03. メソッド名からクエリを作る20分
04. 検索条件の組み立て15分
05. ページングと並び替え15分
06. N+1問題15分
7
例外処理と横断的関心事
01. 例外をHTTPに変換する15分
02. @ExceptionHandlerと@ControllerAdvice15分
03. エラーレスポンスの形を決める15分
04. フィルタとインターセプタ15分
05. ログとリクエストの追跡15分
06. 設定値の外部化15分
8
テストと仕上げ
01. テストの種類と使い分け15分
02. Serviceの単体テスト15分
03. モックで依存を差し替える15分
04. MockMvcでエンドポイントを試す15分
05. 本番へ出すための次の一歩10分

JSONとオブジェクトの往復

このレッスンでは、JSON とオブジェクトの往復を Spring Boot がどう肩代わりしているのかを理解し、その変換処理の中身を自分の手で書けるようになります。

リクエストの本文はただの文字列です

クライアントから届くのは、次のような文字の並びでしかありません。

JSON

{"name":"taro","age":20}

これは Java から見ればただの String です。{ や " の位置を読み取り、キーと値に切り分け、age は数値だと判断し、User クラスのフィールドへ入れる。この一連の作業を誰かがやらなければ、コントローラのメソッドはオブジェクトを受け取れません。

Spring Boot ではその作業を Jackson というライブラリが担当します。spring-boot-starter-web を入れると Jackson が一緒に入り、MappingJackson2HttpMessageConverter として自動で登録されます。だから開発者は変換コードを1行も書きません。

@RequestBody が入口です

Java

@RestController @RequestMapping("/users") public class UserController { @PostMapping public User create(@RequestBody UserRequest req) { return new User(req.getName(), req.getAge()); } }

@RequestBody が付いた引数を見ると、Spring はリクエストの Content-Type を確認し、application/json であれば Jackson を選び、本文の文字列を UserRequest に変換してから引数へ渡します。この方向をデシリアライズと呼びます。

戻り値は逆向きに変換されます

@RestController が付いたクラスのメソッドの戻り値は、ビューの名前ではなくレスポンス本文そのものとして扱われます。返した User オブジェクトは Jackson によって JSON の文字列に組み立て直され、Content-Type に application/json が付いて返ります。この方向をシリアライズと呼びます。

向き呼び名きっかけ変換の中身
JSON から Javaデシリアライズ@RequestBody文字列を解析してフィールドへ詰める
Java から JSONシリアライズ戻り値フィールドを読み出して文字列を組む

何をキーにするのかを Jackson は知っています

Jackson は既定でアクセサ(getter と setter)の名前からプロパティ名を決めます。getName があれば name というキーになります。record の場合はアクセサ名がそのままフィールド名なので、name と age がそのままキーになります。名前を変えたいときは @JsonProperty("user_name") のようにフィールドやアクセサへ付けて指定します。

型が合わないとどうなるでしょうか

{"age":"twenty"} のように数値のはずの場所へ文字列が入っていると、変換の途中で失敗します。Spring Boot はこれを 400 Bad Request として扱います。つまり検証の前に、まず変換が通るかどうかという関門があるわけです。コントローラのメソッドには一度も入りません。

演習で書くもの

この演習では、Jackson がやっていることを極端に単純にした形で体験します。name=taro;age=20 のような区切り文字列を読み取り、キーと値に切り分け、値が数値だけでできているなら数値として、そうでなければ文字列としてクオートを付けて、JSON らしい文字列を組み立てます。Spring では @RequestBody を書けば自動で行われる処理を、ここでは自分の手で書きます。区切りの解析、型の判定、出力の組み立てという3つの仕事が変換の正体だと分かるはずです。

要件

  1. セミコロンで区切り、さらに最初のイコールでキーと値に分けること。キーと値の前後の空白は取り除くこと
  2. 値が数字だけで構成されていればクオートなしの数値として、そうでなければダブルクオートで囲んで出力すること
  3. 全体を波かっこで囲み、要素どうしはカンマでつなぐこと。入力が空または null のときは {} を返すこと

入出力例

toJson("name=taro;age=20") → "{"name":"taro","age":20}" toJson("age=7") → "{"age":7}" toJson("name=hanako;city=tokyo;age=35") → "{"name":"hanako","city":"tokyo","age":35}" toJson("") → "{}" toJson("name=a b;score=10x") → "{"name":"a b","score":"10x"}"

ヒント

String の split(";") で区切り、indexOf('=') で最初のイコールの位置を探すと、値の中にイコールがあっても壊れません

数値かどうかは文字を1つずつ見て 0 から 9 の範囲かどうかで判定できます。空文字列は数値ではないとしてください

カンマを付けるかどうかは、最初の要素かどうかを覚えておく boolean で判断すると簡潔です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • DTOとエンティティを分ける

    内部モデルから公開用の表現へ変換する処理を書きます。

  • recordでDTOを書く

    record を使った不変な DTO を定義できるようになります。

  • 入力検証の基本

    必須・長さ・範囲の検証を実装できるようになります。

  • 検証エラーをまとめて返す

    複数のエラーを集約したレスポンスを組み立てます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • applicationJSON 本文を送るときの Content-Type
  • オブジェクトキーと値のペアで構造を作るデータ
  • 処理計算や代入を表す長方形
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • 判断YES/NO 分岐を表す菱形
  • クラスデータと振る舞いを束ねる単位
  • フィールドクラスが持つデータ
  • メソッドクラスに属する関数
main.java
学習モード
エディタを読み込んでいます

メモ

JSONとオブジェクトの往復

⌘S で保存