I hava a value class
in my android project (kotlin) and I want to parse a object, that contains this value class as type for a attribute, to json.
Let's say this is my value class
:
@JsonClass(generateAdapter = true)
@JvmInline
value class CustomDate(val value: String)
and this is my object that contains a attribute with the value class shown before:
data class MyTestClass(
val attr1: CustomDate
)
If I now try to convert it to Json using moshi I will get this:
...
attr1: {
value: "a test valu"
}
...
What I want it to transform the object to this:
...
attr1: "a test valu"
...
but I don't know how to achieve this. There is no JsonTransformingSerializer
for moshi like it seems so how am I able to transform the object itself and not only the value like done using a JsonAdapter
?
Maybe I missed something but I would appriciate any suggestion.
I found how how to use it in case anyone is facing the same problem:
I needed to create a custom JsonAdapter.Factory
and a according JsonAdapter<CustomDate>
:
class CustomDateAdapterFactory : JsonAdapter.Factory {
override fun create(type: Type, annotations: Set<Annotation>, moshi: Moshi): JsonAdapter<*>? {
if (!annotations.isEmpty()) return null
if (type === CustomDate::class.java) return CustomDateAdapter()
return null
}
}
class CustomDateAdapter : JsonAdapter<CustomDate>() {
@FromJson
override fun fromJson(reader: JsonReader): CustomDate {
return CustomDate(reader.nextString())
}
@ToJson
override fun toJson(writer: JsonWriter, value: CustomDate?) {
writer.value(value?.value)
}
}
After that I had to add the CustomDateAdapterFactory
to my moshi builder:
Moshi.Builder()
.addLast(CustomDateAdapterFactory())
.build()
That's it! :)