feat : Car 와 Owner 의 직렬화에 사용되는 Serializer 추가

This commit is contained in:
banjjoknim
2022-03-12 13:20:27 +09:00
parent 889ff261a8
commit 0d66541289
2 changed files with 51 additions and 0 deletions

View File

@@ -10,6 +10,8 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer
*
* Custom Serializer 를 만들기 위해서는 아래와 같이 StdSerializer<T> 를 상속해야 한다.
*
* 만약 어노테이션을 이용한 설정 또는 프로퍼티마다 다르게 작동하는 Serializer 를 만들고 싶다면 JsonSerializer 의 add-on interface 인 ContextualSerializer 를 구현하면 된다.
*
* @see com.fasterxml.jackson.databind.ser.std.StdSerializer
* @see com.fasterxml.jackson.databind.ser.ContextualSerializer
*/
@@ -37,3 +39,22 @@ class CarPriceSerializer : StdSerializer<Car>(Car::class.java) {
gen.writeEndObject()
}
}
class CarNameOwnerSerializer : StdSerializer<Car>(Car::class.java) {
override fun serialize(value: Car, gen: JsonGenerator, provider: SerializerProvider) {
gen.writeStartObject()
gen.writeStringField("name", value.name)
gen.writeObjectField("owner", value.owner)
gen.writeEndObject()
}
}
class CarNameOwnerNameSerializer : StdSerializer<Car>(Car::class.java) {
override fun serialize(value: Car, gen: JsonGenerator, provider: SerializerProvider) {
gen.writeStartObject()
gen.writeStringField("name", value.name)
gen.writeObjectFieldStart("owner")
gen.writeStringField("name", value.owner.name)
gen.writeEndObject()
}
}

View File

@@ -1,5 +1,7 @@
package com.banjjoknim.playground.jsonserialize
import com.banjjoknim.playground.jackson.jsonserialize.CarNameOwnerNameSerializer
import com.banjjoknim.playground.jackson.jsonserialize.CarNameOwnerSerializer
import com.banjjoknim.playground.jackson.jsonserialize.CarNameSerializer
import com.banjjoknim.playground.jackson.jsonserialize.CarPriceSerializer
import com.banjjoknim.playground.jackson.jsonserialize.CarSerializer
@@ -92,5 +94,33 @@ class CarSerializerTest {
// then
assertThat(result).isEqualTo("""{"price":10000000}""")
}
@Test
fun `자동차의 이름과 오너의 모든 필드를 직렬화한다`() {
// given
val module = SimpleModule()
module.addSerializer(Car::class.java, CarNameOwnerSerializer())
mapper.registerModule(module)
// when
val result = mapper.writeValueAsString(car)
// then
assertThat(result).isEqualTo("""{"name":"banjjoknim","owner":{"name":"ban","age":30}}""")
}
@Test
fun `자동차의 이름과 오너의 이름만 직렬화한다`() {
// given
val module = SimpleModule()
module.addSerializer(Car::class.java, CarNameOwnerNameSerializer())
mapper.registerModule(module)
// when
val result = mapper.writeValueAsString(car)
// then
assertThat(result).isEqualTo("""{"name":"banjjoknim","owner":{"name":"ban"}}""")
}
}
}