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.