diff --git a/src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt b/src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt new file mode 100644 index 0000000..3ae938f --- /dev/null +++ b/src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt @@ -0,0 +1,24 @@ +package dev.usbharu.ap.model.json + +import dev.usbharu.ap.serialization.Deserializable +import dev.usbharu.ap.serialization.Serializable +import dev.usbharu.ap.serialization.SerializerSpec +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.buildJsonArray +import kotlin.reflect.KClass + +class ListSerializer(private val clazz: KClass) : Serializable>, Deserializable> { + override fun deserialize(spec: SerializerSpec, element: JsonElement): List { + if (element is JsonArray) { + return element.map { spec.deserializer(clazz).deserialize(spec, it) } + } + return listOf(spec.deserializer(clazz).deserialize(spec, element)) + } + + override fun serialize(spec: SerializerSpec, value: List): JsonElement { + return buildJsonArray { + value.forEach { add(spec.serializer(clazz).serialize(spec, it)) } + } + } +} diff --git a/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt b/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt index cc6caa1..1ba6e22 100644 --- a/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt +++ b/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt @@ -1,12 +1,18 @@ package dev.usbharu.ap.model.json import dev.usbharu.ap.serialization.Deserializable +import dev.usbharu.ap.serialization.Serializable import dev.usbharu.ap.serialization.SerializerSpec import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.jsonPrimitive -object StringSerializer : Deserializable { +object StringSerializer : Deserializable,Serializable { override fun deserialize(spec: SerializerSpec, element: JsonElement): String { return element.jsonPrimitive.content } + + override fun serialize(spec: SerializerSpec, value: String): JsonElement { + return JsonPrimitive(value) + } } diff --git a/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt b/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt index 3cdae70..e6d57d7 100644 --- a/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt +++ b/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt @@ -4,8 +4,8 @@ import kotlinx.serialization.json.JsonElement import kotlin.reflect.KClass class SerializerSpecImpl( - val deserializers: MutableMap, Deserializable<*>> = mutableMapOf(), - val serializers: Map, Serializable<*>> = emptyMap() + val deserializers: Map, Deserializable<*>> = emptyMap(), + val serializers: Map, Serializable<*>> = emptyMap(), ) : SerializerSpec { override fun deserializer(clazz: KClass): Deserializable = deserializers.getValue(clazz) as Deserializable diff --git a/src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt b/src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt new file mode 100644 index 0000000..7acf29e --- /dev/null +++ b/src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt @@ -0,0 +1,19 @@ +package dev.usbharu.ap + +import dev.usbharu.ap.model.json.StringSerializer +import dev.usbharu.ap.serialization.SerializerSpecImpl +import dev.usbharu.ap.serialization.serialize +import org.junit.jupiter.api.Test + +class ListSerializerTest { + @Test + fun Listをシリアライズ出来るか() { + val serializerSpecImpl = SerializerSpecImpl( + serializers = mapOf( + List::class to dev.usbharu.ap.model.json.ListSerializer(String::class), + String::class to StringSerializer + ) + ) + println(serializerSpecImpl.serialize(listOf(1,2,3))) + } +} diff --git a/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt b/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt index b0d1199..9ff3b59 100644 --- a/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt +++ b/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt @@ -33,7 +33,7 @@ class PersonSerializeTest { Person::class to Person.Companion, PrimitiveOrArray::class to PrimitiveOrArray.Companion, PublicKey::class to PublicKey.Companion, - Image::class to Image.Companion + Image::class to Image.Companion, ) ).serialize(person) println(serialize)