feat: typeなどの要素が一つのとき配列ではなく文字列で返すように

This commit is contained in:
usbharu 2023-04-01 09:55:48 +09:00
parent 25bc5e9761
commit 7d716a4d35
3 changed files with 69 additions and 0 deletions

View File

@ -3,15 +3,20 @@ package dev.usbharu.hideout.ap
import com.fasterxml.jackson.annotation.JsonAutoDetect import com.fasterxml.jackson.annotation.JsonAutoDetect
import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.core.TreeNode import com.fasterxml.jackson.core.TreeNode
import com.fasterxml.jackson.databind.JsonDeserializer import com.fasterxml.jackson.databind.JsonDeserializer
import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.JsonSerializer
import com.fasterxml.jackson.databind.SerializerProvider
import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.annotation.JsonSerialize
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
open class JsonLd { open class JsonLd {
@JsonProperty("@context") @JsonProperty("@context")
@JsonDeserialize(contentUsing = ContextDeserializer::class) @JsonDeserialize(contentUsing = ContextDeserializer::class)
@JsonSerialize(using = ContextSerializer::class)
var context:List<String> = emptyList() var context:List<String> = emptyList()
@JsonCreator @JsonCreator
@ -31,3 +36,22 @@ public class ContextDeserializer : JsonDeserializer<String>() {
return readTree.asText() return readTree.asText()
} }
} }
public class ContextSerializer : JsonSerializer<List<String>>() {
override fun serialize(value: List<String>?, gen: JsonGenerator?, serializers: SerializerProvider?) {
if (value.isNullOrEmpty()) {
gen?.writeNull()
return
}
if (value?.size == 1) {
gen?.writeString(value[0])
} else {
gen?.writeStartArray()
value?.forEach {
gen?.writeString(it)
}
gen?.writeEndArray()
}
}
}

View File

@ -1,6 +1,12 @@
package dev.usbharu.hideout.ap package dev.usbharu.hideout.ap
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.databind.JsonSerializer
import com.fasterxml.jackson.databind.SerializerProvider
import com.fasterxml.jackson.databind.annotation.JsonSerialize
open class Object : JsonLd { open class Object : JsonLd {
@JsonSerialize(using = TypeSerializer::class)
private var type: List<String> = emptyList() private var type: List<String> = emptyList()
var name: String? = null var name: String? = null
@ -19,3 +25,19 @@ open class Object : JsonLd {
} }
} }
} }
public class TypeSerializer : JsonSerializer<List<String>>() {
override fun serialize(value: List<String>?, gen: JsonGenerator?, serializers: SerializerProvider?) {
println(value)
if (value?.size == 1) {
gen?.writeString(value[0])
} else {
gen?.writeStartArray()
value?.forEach {
gen?.writeString(it)
}
gen?.writeEndArray()
}
}
}

View File

@ -0,0 +1,23 @@
package dev.usbharu.hideout.ap
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
class ContextSerializerTest{
@Test
fun serialize() {
val accept = Accept(
name = "aaa",
actor = "bbb",
`object` = Follow(
name = "ccc",
`object` = "ddd",
actor = "aaa"
)
)
val writeValueAsString = jacksonObjectMapper().writeValueAsString(accept)
println(writeValueAsString)
}
}