dave08
02/02/2022, 12:36 PM{"a": "a", "b":true, "c":1, "d": 10000000000000000000} (if I want it as Map<String, Any>), and would it differentiate between Int Long Float and Double? Or does it just put all numbers in one of those (In Moshi, they just put them all in Doubles... https://github.com/square/moshi/issues/1144)? Do I need to manually serialize all this or is there an easy way to do this?Dominaezzz
02/02/2022, 12:40 PMAny just isn't supported like that out of the box. You'll have to write a small custom serializer to parse a JsonPrimitive and pull out the value from it.dave08
02/02/2022, 12:43 PMJavier
02/02/2022, 12:44 PMJavier
02/02/2022, 12:44 PMdave08
02/02/2022, 12:45 PMdave08
02/02/2022, 12:47 PMdave08
02/02/2022, 12:48 PMDominaezzz
02/02/2022, 12:49 PMclass SpecialAnySerializer : KSerializer<Any> {
override val descriptor: SerialDescriptor get() = JsonPrimitive.serializer().descriptor
override fun deserialize(decoder: Decoder): Any {
val primitive = decoder.decodeSerializableValue(JsonPrimitive.serializer())
return primitive.long
}
override fun serialize(encoder: Encoder, value: Any) {
TODO("Not yet implemented")
}
}dave08
02/02/2022, 12:50 PMDominaezzz
02/02/2022, 12:50 PMDominaezzz
02/02/2022, 12:50 PMAny ?Dominaezzz
02/02/2022, 12:51 PMMap<String, JsonPrimitive> .dave08
02/02/2022, 12:53 PMSharedPreferences file each one as it's original type...dave08
02/02/2022, 12:55 PMJsonPrimitive would make the Repository implementation dependant on the Parser implementation... to convert it to Map<String, Any> to pass to the repository is an extra step... but I guess that would be one possibility...Dominaezzz
02/02/2022, 12:58 PMclass SpecialAnySerializer : KSerializer<Any> {
override val descriptor: SerialDescriptor get() = JsonPrimitive.serializer().descriptor
override fun deserialize(decoder: Decoder): Any {
val primitive = decoder.decodeSerializableValue(JsonPrimitive.serializer())
return primitive.longOrNull ?: primitive.doubleOrNull ?: primitive.booleanOrNull ?: primitive.content
}
override fun serialize(encoder: Encoder, value: Any) {
// encoder.encodeSerializableValue(JsonPrimitive.serializer(), JsonPrimitive(value))
}
}Dominaezzz
02/02/2022, 1:00 PMdave08
02/02/2022, 1:01 PMdave08
02/02/2022, 1:44 PMJson.decodeFromString<Map<String, Any>>(SpecialAnySerializer(), """
{
"a": "a",
"b": 1111,
"c": 11111111111111111,
"d": 111111111111111111111111111111111111111111111111111
}
""".trimIndent())
but it looks like that's wrong...dave08
02/02/2022, 1:44 PMDominaezzz
02/02/2022, 1:44 PMJson.decodeFromString<Map<String, Any>>(MapSerializer(String.serializer(), SpecialAnySerializer()), """
{
"a": "a",
"b": 1111,
"c": 11111111111111111,
"d": 111111111111111111111111111111111111111111111111111
}
""".trimIndent())Dominaezzz
02/02/2022, 1:46 PMMap<String, @Serializable(SpecialAnySerializer::class) Any> within a class.dave08
02/02/2022, 1:47 PMdave08
02/02/2022, 1:48 PMval inside the parser class.