janvladimirmostert
08/16/2024, 2:46 PMFilter.NOT(
Filter.Field(
name = "foo", value = "bar"
)
)
to exactly this (without type field or name and value fields, just this):
{
"not": {
"foo": "bar"
}
}
this is what I'm playing with currently, but I'm stuck:
@Serializable
sealed interface Filter {
...
@Serializable
@SerialName("not")
class NOT(val not: Filter): Filter
@Serializable(with = Field.Companion::class)
data class Field(
val name: String,
val value: String
) : Filter {
companion object : KSerializer<Field> {
override val descriptor: SerialDescriptor
get() = mapSerialDescriptor<String, String>()
override fun serialize(encoder: Encoder, value: Field) {
encoder.encodeStructure(mapSerialDescriptor<String, String>()) {
mapOf("a" to "b", value.name to value.value) // this does nothing due to block: (...) -> Unit
}
}
override fun deserialize(decoder: Decoder): Field = TODO()
}
}
}
currently outputs:
{
"not": {
"type": "kotlin.collections.HashMap"
}
}
I'm probably not using mapSerialDescriptor correctly, but not sure how to use it correctly.
any suggestions?janvladimirmostert
08/16/2024, 3:59 PM@Serializable(with = Field.Companion::class)
data class Field(
val name: String,
val value: String
) : Filter {
companion object : JsonTransformingSerializer<Field>(Field.serializer()) {
override fun transformSerialize(element: JsonElement): JsonElement {
return JsonObject(mutableMapOf<String, JsonElement>().apply {
put("foo", JsonPrimitive("bar"))
})
}
}
}
is throwing:
Caused by: java.lang.NullPointerException: Cannot invoke "com.jvaas.testing.model.filter.Filter$Field$Companion.serializer()" because "com.jvaas.testing.model.filter.Filter$Field.Companion" is null
Adam S
08/16/2024, 4:50 PMjanvladimirmostert
08/16/2024, 7:14 PM@Serializable(with = FieldSerializer::class)
data class Field(
val name: String,
val value: String
) : Filter
object FieldSerializer : JsonTransformingSerializer<Field>(Field.serializer()) {
override fun transformSerialize(element: JsonElement): JsonElement {
return JsonObject(mutableMapOf<String, JsonElement>().apply {
put("foo", JsonPrimitive("bar"))
})
}
}
getting a similar error
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.jvaas.testing.model.filter.Filter$NOT.<clinit>(Filter.kt:62)
at Test.main(Test.kt:17)
Caused by: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlinx.serialization.json.JsonTransformingSerializer.<init>, parameter tSerializer
at kotlinx.serialization.json.JsonTransformingSerializer.<init>(JsonTransformingSerializer.kt)
at com.jvaas.testing.model.filter.Filter$FieldSerializer.<init>(Filter.kt:73)
at com.jvaas.testing.model.filter.Filter$FieldSerializer.<clinit>(Filter.kt)
i tried making the FieldSerializer object a class instead of an object, but then I get a StackOverflow error as the class is instantiated over and over due to Field.serializer()
Working around the Stackoverflow error
@Serializable(with = FieldSerializer::class)
data class Field(
val name: String,
val value: String
) : Filter {
companion object {
val serializer = Field.serializer()
}
}
object FieldSerializer : JsonTransformingSerializer<Field>(Field.serializer) {
override fun transformSerialize(element: JsonElement): JsonElement {
return JsonObject(mutableMapOf<String, JsonElement>().apply {
put("foo", JsonPrimitive("bar"))
})
}
}
I'm once again getting the same error
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.jvaas.testing.model.filter.Filter$NOT.<clinit>(Filter.kt:62)
at Test.main(Test.kt:17)
Caused by: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlinx.serialization.json.JsonTransformingSerializer.<init>, parameter tSerializer
at kotlinx.serialization.json.JsonTransformingSerializer.<init>(JsonTransformingSerializer.kt)
at com.jvaas.testing.model.filter.Filter$FieldSerializer.<init>(Filter.kt:76)
at com.jvaas.testing.model.filter.Filter$FieldSerializer.<clinit>(Filter.kt)
... 2 more
janvladimirmostert
08/22/2024, 6:52 AM