Andreas Unterweger
03/26/2020, 1:23 PMcase 1: { data: {props.....} } -> StoredVehicleUserSingle
case 2: { data: [ {props.....}, {props.....} ] } -> StoreVehicleUsers with a list of StoredVehicleUsersList
so far i have solved it like this:
data class StoredVehicleUsers(
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, defaultImpl = StoredVehicleUserList::class)
@JsonProperty("data") val vehicleUsers: List<StoredVehicleUser>
)
/**
* we need to implementations for this for:
* [StoredVehicleUsers] its [StoredVehicleUserList]
* if its a single [StoredVehicleUser] we receive its [StoredVehicleUserSingle]
*/
interface StoredVehicleUser {
val vehicleId: String
val userId: String
val role: String?val roleTimestamp: Date?
val resetRole: String?
val resetRoleTimestamp: Date?
}
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
@JsonTypeName(value = "data")
internal data class StoredVehicleUserSingle(
override val vehicleId: String,
override val userId: String,
override val role: String? = null,
override val roleTimestamp: Date? = null,
override val resetRole: String? = null,
override val resetRoleTimestamp: Date? = null
) : StoredVehicleUser
internal data class StoredVehicleUserList(
override val vehicleId: String,
override val userId: String,
override val role: String? = null,
override val roleTimestamp: Date? = null,
override val resetRole: String? = null,
override val resetRoleTimestamp: Date? = null
) : StoredVehicleUser
i think the solution is fine, the only thing that bugs me, is that i am repeating all properties in StoredVehicleUser, StoredVehicleUserSingle and StoredVehicleUserList, despite they are same. the implementations must be data classes to have euqal and hashcode.
but if i use inheritance i actually must list all props in subclasses again and pass them to Super constructor. also a data class must have at least one constructor argument
How can i do this better? (edited)trathschlag
03/26/2020, 1:34 PM- parse json as json tree
- if there is an array "data": convert every entry to StoredVehicleUser
- else there must be an object "data", convert to StoredVehicleUser and wrap in List<>
The incoming json is not well formed and so it's completely fine to have some special handling code to transform into a well formed business object which you can process further (imo).trathschlag
03/26/2020, 1:35 PMAndreas Unterweger
03/26/2020, 1:38 PMtrathschlag
03/26/2020, 1:42 PMdata class User(val name: String, val email: ...)
data class UserWithPassword(val user: User, val password: String)
Andreas Unterweger
03/26/2020, 1:50 PMaraqnid
03/26/2020, 2:01 PMaraqnid
03/26/2020, 2:03 PMAndreas Unterweger
03/26/2020, 2:05 PMAndreas Unterweger
03/26/2020, 2:05 PM@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
@JsonTypeName(value = "data")
data class StoredVehicleUserSingle( @JsonIgnore() val ignore: Int) : Base()
internal data class StoredVehicleUserList( @JsonIgnore() val ignore: Int) : Base()
abstract class Base: StoredVehicleUser, HasToJson {
override val vehicleId: String = ""
override val userId: String = ""
override val role: String? = null
override val roleTimestamp: Date? = null
override val resetRole: String? = null
override val resetRoleTimestamp: Date? = null
}
Andreas Unterweger
03/26/2020, 2:25 PMimport com.fasterxml.jackson.annotation.*
import seat.b4.testing.serialize.HasToJson
import java.util.*
data class StoredVehicleUsers(
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, defaultImpl = StoredVehicleUserList::class)
@JsonProperty("data") val vehicleUsers: List<StoredVehicleUser>
) : HasToJson
/**
* we need to implementations for this for:
* [StoredVehicleUsers] its [StoredVehicleUserList]
* if its a single [StoredVehicleUser] we receive its [StoredVehicleUserSingle]
*/
abstract class StoredVehicleUser : HasToJson {
lateinit var vehicleId: String
lateinit var userId: String
val role: String? = null
val roleTimestamp: Date? = null
val resetRole: String? = null
val resetRoleTimestamp: Date? = null
}
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
@JsonTypeName(value = "data")
@JsonInclude(JsonInclude.Include.NON_NULL)
data class StoredVehicleUserSingle(val ignore: Any? = null) : StoredVehicleUser(), HasToJson
@JsonInclude(JsonInclude.Include.NON_NULL)
internal data class StoredVehicleUserList(val ignore: Any? = null) : StoredVehicleUser()
Michael de Kaste
03/26/2020, 3:56 PMAndreas Unterweger
03/29/2020, 2:34 PMMichael de Kaste
03/30/2020, 8:34 AMsealed class StoredVehicleUser{
data class Single(
...fields
) : StoredVehicleUser()
data class List(
atLeastOne: Single,
more: List<Single>
) : StoredVehicleUser()
}
Michael de Kaste
03/30/2020, 8:36 AMAndreas Unterweger
03/30/2020, 8:40 AMAndreas Unterweger
03/30/2020, 8:42 AM