[SpringBoot] CustomJsonDeserializer ๊ตฌํํ๊ธฐ (String to List<Object>)
์์ ๊ฐ์ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ฐ์ฒด๋ก ๋ณํ
๊ธฐ๋ํ ๊ฐ์ฒด ํ์์ ์๋์ ๊ฐ๋ค.
Payload(id = "...", payload = List(Map("..." to "..."))
์๋ ์ฝ๋๋ก ํ์ฑ ์งํ
/* build.gradle.kts */
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
/* parsing logic */
jacksonObjectMapper().readValue(msg, PayLoad::class.java)
ํ์ง๋ง
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.util.Map<java.lang.String,java.lang.Object>>` from String value (token `JsonToken.VALUE_STRING`)
์ด๋ ๊ฒ ํ์ฑ์๋ฌ๊ฐ ๋จ์ด์ง๋ค ใ ใ
์ฌ๋ฌ ์ฝ์ง์ ํด๋ณด๋,
ํ์ฌ๋ payload value๊ฐ์ด String ๊ทธ ์์ฒด๋ก ๋ค์ด์ค๋ ์ค์ด์๋ค.
์ฆ, ์๊ฐ ์๋๋ผ
์ด๋ฐ ํ์์ด์ด์ผ List์ Map์ ์ ํํ ์ธ์ ํ ์ ์๋ค.
๋ง์ฝ, Request๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด ์ธ์ํ ์ ์๋๋ก JsonDeserializer๋ฅผ ๊ตฌํํ์!
์ฐ์ ํด๋์ค๋ฅผ ์์ฑํ๊ณ , JsonDeserializer๋ฅผ ์์๋ฐ๋๋ค. ์ด๋ ์ ๋ค๋ฆญ ํ์ ์ ์์ ์ด ์ต์ข ์ ์ผ๋ก ์ป๊ณ ์ํ๋ ๊ฐ์ฒด ํ์ ์ ๋ฃ์ผ๋ฉด ๋๋ค!
ํ์ฌ์ ๊ฒฝ์ฐ List<Map<?, ?> ํ์์ ์ป๊ณ ์ ํ๋ฏ๋ก ์๋์ ๊ฐ์ด ์์ฑ
class PayloadDeserializer: JsonDeserializer<List<Map<String, Any?>>>()
๊ทธ๋ฌ๋ฉด ์ธํ ๋ฆฌ์ ์ด๊ฐ ์๋์ผ๋ก overrideํ ํจ์๋ฅผ ์์ฑํด์ค๋ค.
์ ๋ฌ๋ฐ์ String์ JsonParser์ text๋ก ์กด์ฌํ๊ณ ์๋ค.
ํ์ฌ๋ Text๋ฅผ ํ๋ฒ ๋ ํ์ฑ ํด์ฃผ๊ณ ์ด๋ฅผ List<Map<>> ํํ๋ก ์บ์คํ ํ ๊ฐ์ ๋ฐ๋๋ก ํ์๋ค.
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List<Map<String, Any?>> {
val listString = jacksonObjectMapper().readValue(p?.text, List::class.java)
return listString as List<Map<String, Any?>>
}
์์ฑ๋ Deserializer๋ ์๋์ ๊ฐ๋ค.
class PayloadDeserializer: JsonDeserializer<List<Map<String, Any?>>>() {
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List<Map<String, Any?>> {
val listString = jacksonObjectMapper.readValue(p?.text, List::class.java)
return listString as List<Map<String, Any?>>
}
}
์ด์ ํด๋น ํ๋์ ์ ์ฉ์ํจ๋ค.
@JsonDeserialize(using = PayloadDeserializer::class)
์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค!
data class PayloadRequest (
val footprintId: String,
@JsonDeserialize(using = PayloadDeserializer::class)
val payload: List<Map<String, Any?>>
)
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด, ์์ฃผ ๊น๋ํ๊ฒ ์ํ๋ ๊ฐ์ ์ป์ ์ ์๋ค!!!!!