- JAVA
Jackson UnrecognizedPropertyExceptionの直し方
UnrecognizedPropertyException: Unrecognized field "email" (class User), not marked as ignorable (2 known properties: "id", "name"]) は、JSON に、Java のクラスに無い項目(この例では email)があったときの例外です。
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "email" (class J$User), not marked as ignorable (2 known properties: "id", "name"])
at [Source: (String)"{"id":1,"name":"山田","email":"y@x"}"; line: 1, column: 30] (through reference chain: J$User["email"])
エラー文の中に、答えがそろっています。
| エラー文の部分 | 分かること |
|---|---|
Unrecognized field "email" |
JSON の、知らない項目の名前 |
(class J$User) |
変換しようとしたクラス |
2 known properties: "id", "name" |
Jackson が知っている項目の名前(クラス側の名前) |
through reference chain: J$User["email"] |
入れ子の JSON なら、どの階層か |
Unrecognized field と known properties を見比べると、原因の多くは次のどれかです。
| 見比べた結果 | 原因 | 直し方 |
|---|---|---|
JSON にだけある項目(email) |
API の応答に項目が増えたなど | @JsonIgnoreProperties(ignoreUnknown = true)、または設定で無視 |
user_name と userName |
名前の書き方(スネークケース)が違う | @JsonProperty("user_name")、または命名の設定 |
Id と id |
大文字小文字が違う | 名前を合わせる、または大文字小文字を区別しない設定 |
isActive と active |
boolean の getter の名前の決まり | getter・setter に @JsonProperty("isActive") |
user だけが知らない |
JSON が {"user": {...}} と包まれている |
中身を取り出してから変換 |
確認環境:Jackson 2.14(jackson-databind 2.14.0)、OpenJDK 21 で再現しました(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Jackson UnrecognizedPropertyExceptionの直し方」
原因① JSON にだけある項目 → 無視する
public class User { public int id; public String name; }
om.readValue("{\"id\":1,\"name\":\"山田\",\"email\":\"y@x\"}", User.class); // 例外
| 直し方 | 書き方 | 結果 |
|---|---|---|
| クラスに付ける | @JsonIgnoreProperties(ignoreUnknown = true) |
User2{id=1, name=山田} |
| ObjectMapper 全体の設定 | om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) |
User{id=1, name=山田} |
| JsonMapper を作るとき | JsonMapper.builder().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).build() |
User{id=1, name=山田} |
外部の API の応答を受け取るクラスは、知らない項目を無視しておくと、相手が項目を増やしても止まらずに済みます。 一方、自社の画面から送られる入力を受け取るクラスでは、知らない項目をエラーにしたほうが、打ち間違いに気づける場合もあります。どちらにするかは、クラスごとに決めます。
Spring Boot では、spring.jackson.deserialization.<機能の名前> のプロパティで DeserializationFeature を設定できることが、Spring Boot のドキュメントに載っています。
原因② user_name と userName(スネークケース)
Unrecognized field "user_name" (class J$User3), not marked as ignorable (2 known properties: "id", "userName"])
| 直し方 | 結果 |
|---|---|
フィールドに @JsonProperty("user_name") |
User4{id=1, userName=山田} |
om.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) |
User3{id=1, userName=山田} |
API 全体がスネークケースなら命名の設定、一部の項目だけなら @JsonProperty が向いています。
ここで「知らない項目を無視する」設定にすると、例外は消えますが、userName は null のままになります。名前の違いが原因のときは、無視ではなく名前を合わせます。
原因③ 大文字小文字
Unrecognized field "Id" (class J$User), not marked as ignorable (2 known properties: "id", "name"])
Jackson は、既定では大文字小文字を区別しました。 MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES を有効にした JsonMapper では、{"Id":1} を id に入れられました。
原因④ boolean の isActive
public class Flag {
private boolean isActive;
public boolean isActive() { return isActive; }
public void setActive(boolean v) { isActive = v; }
}
| 操作 | 結果 |
|---|---|
| Java → JSON | {"active":true}(is が取れた) |
{"isActive":true} → Java |
Unrecognized field "isActive" ... (one known property: "active"]) |
getter の isActive() から、Jackson は項目の名前を active と判断しました。 JSON の名前を isActive にしたいときは、@JsonProperty("isActive") で名前を決めます。
@JsonProperty("isActive") を付けた場所 |
{"isActive":true} を読む |
Java → JSON |
|---|---|---|
| フィールド | 読めた | {"active":true,"isActive":true}(2つ出た) |
| getter と setter | 読めた | {"isActive":true} |
フィールドだけに付けると、getter の active も残り、JSON に2つ出ました。 getter と setter に付けると1つになりました。
原因⑤ JSON が包まれている
{"user": {"id": 1, "name": "a"}}
→ Unrecognized field "user" (class J$User), not marked as ignorable (2 known properties: "id", "name"])
known properties に中身の項目(id・name)があり、user だけが知らないときは、JSON が1段包まれています。
JsonNode root = om.readTree(json);
User u = om.treeToValue(root.get("user"), User.class); // User{id=1, name=a}
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | 知らない項目の名前 | Unrecognized field "○○" |
| 2 | Jackson が知っている名前 | known properties: ... |
| 3 | 名前の違いか、本当に無い項目か | スネークケース・大文字小文字・is |
| 4 | 名前の違いなら | @JsonProperty・命名の設定 |
| 5 | 本当に無い項目なら | @JsonIgnoreProperties(ignoreUnknown = true) |
| 6 | 包まれていないか | readTree で中身を取り出す |
よくある質問
Q. Jackson 3 でも同じですか。
A. この記事は Jackson 2.14(com.fasterxml.jackson.databind のパッケージ)で確かめました。Spring Boot のドキュメントによると、Jackson 3 ではパッケージが tools.jackson に変わっています(アノテーションは com.fasterxml.jackson.annotation のまま)。版を上げたときは、import と既定の設定を確かめます。
Q. ObjectMapper の基本の使い方は。 A. 既存の記事「Jackson ObjectMapperの使い方|JSON変換・日付・record」で扱っています。
まとめ
- JSON に、クラスが知らない項目があった例外
Unrecognized fieldとknown propertiesを見比べる- 本当に無い項目なら
@JsonIgnoreProperties(ignoreUnknown = true) - 名前の違い(
user_name・Id・isActive)なら、無視せずに名前を合わせる {"user": {...}}のように包まれていたら、中身を取り出す
参考・出典
確認日はいずれも 2026年10月11日です。
- Spring Boot ドキュメント「Spring MVC」(Customize the Jackson JsonMapper):https://docs.spring.io/spring-boot/how-to/spring-mvc.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Jackson UnrecognizedPropertyExceptionの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。