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

This commit is contained in:
2023-04-01 09:55:48 +09:00
parent d5b7d8f6cb
commit ab2eae9daa
3 changed files with 69 additions and 0 deletions
@@ -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()
}
}
}
@@ -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()
}
}
}
@@ -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)
}
}