2
1

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 3 years have passed since last update.

JSONシリアライズするdata classにisXXXという変数名がある時はJsonPropertyをつける

Posted at

発生した問題

  • JSONシリアライズしたいdata classのうち、シリアライズされないプロパティが存在する。

以下のような、data classをResponseに乗せて返却するコントローラーがあります。

@RestController
class JsonTestController {

    @GetMapping("jsonTest")
    fun jsonTest(): ResponseEntity<HaveBoolean> {
        val value = BooleanValue(true)
        return ResponseEntity.ok(HaveBoolean(value))
    }

    data class BooleanValue(val value: Boolean)

    data class HaveBoolean(
        val isAdmin: BooleanValue,
    )
}

こちらを実行(curl http://localhost:8082/jsonTest)すると、空のオブジェクト({})がレスポンスとして返ってきます。本来なら
{"isAdmin":"value"{true}}が返ってきて欲しいのですが。

解決方法

@get:JsonProperty("isXXXX")をプロパティに付与します。

    // 上記のコントローラーからHaveBooleanクラスのみ抜粋
    data class HaveBoolean(
        @get:JsonProperty("isAdmin") //これが必要
        val isAdmin: BooleanValue,
    )

原因

こちらのページから回答を日本語訳にして引用

これは、kotlinにおけるjacksonの既知の問題です。Jacksonは基本的に名前からisを削除しようとしますが、kotlinのデータクラスの実装はisを含まない適切なゲッターを持っていないため、ミスマッチが生じます。JsonProperty("isAdmin")を変数に追加すれば、動作するはずです。

よくわかっていないですが、data classが暗黙的に持つgetter/setterの命名とJacksonの挙動が何らか悪さをしているようです。

参考資料

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?