Ich erhalte ein JSON-Datenmodell mit einem Map-Wrapper Tabelle. Ich versuche, Generics zu verwenden, um den Typ zu übergeben, der jenseits des Wrappers ist, aber es wird zur Laufzeit nicht gut übersetzt. Hier ist ein Beispiel für meine JSON-Datei:Kotlin Gson Deserializing
{
"Table": [
{
"paymentmethod_id": 1,
"paymentmethod_description": "Cash",
"paymentmethod_code": "Cash",
"paymentmethod_is_ach_onfile": false,
"paymentmethod_is_element": false,
"paymentmethod_is_reward": false,
"paymentmethod_is_openedgeswipe": false,
"paymentmethod_update_user_id": 1,
"paymentmethod_insert_user_id": 1,
"paymentmethod_insertdate": "2014-10-07 14:53:16",
"paymentmethod_deleted": false,
"paymentmethod_is_mobile_visible": true
}
]
}
Die Wrapperklasse, die ich verwende, heißt Tabelle.
data class Table<T>(
@SerializedName("Table") val models : Array<T>
)
Die eigentliche Modellklasse ist PaymentMethod.
data class PaymentMethod(
@SerializedName("paymentmethod_id") val idNumber : Int = -1
)
Ich habe eine generische Datenmanager-Klasse erstellt, die < T> Typ nimmt. Ich denke Verwendung Subklassen der Datenmanager die Eingabe und Ergebnisse (wie erklärt die Modellklasse Paymentmethod zu lokalisieren.
open class NXDataManager<T>(manager: NXNetworkManager? = null, rpc : String?, parameters: List<Pair<String, String>>? = null, method : String = "get")
{
...
open fun sendRequest(completionHandler: (models:Array<T>) -> Unit, errorHandler: (error:FuelError) -> Unit) {
val request = NXNetworkRequest(rpc, parameters, method)
request.send(manager, completionHandler = { s: String ->
val table: Table<T> = Gson().fromJson(s)
completionHandler(table.models)
}, errorHandler = errorHandler)
}
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
}
Mein Unterklasse Datenmanager das Modell in zu analysieren gibt.
final public class PaymentMethodsDataManager : NXDataManager<PaymentMethod>
{
constructor() : super("genGetPaymentMethods")
}
wenn ich den Code ausführen wie:
val table: Table<T> = Gson().fromJson(s)
erhalte ich eine Fehlermeldung java.lang.ClassCastExceptio n: java.lang.Object [] kann nicht in Networking.PaymentMethod [] umgewandelt werden. Allerdings, wenn ich in einem expliziten Typ passieren funktioniert es wie erwartet - das Array in Paymentmethod Modelle Parsen:
val table: Table<PaymentMethod> = Gson().fromJson(s)
Irgendwelche Ideen, wie ich immer noch den generischen Typ T verwenden kann?
ich nicht in der Lage war Tabelle :: class.java zu verwenden, da Tabellen seines generischen Typ Tabelle :: class.java angeben muss. Aber das wirft einen Fehler, weil ich vermute, dass der Compiler nicht sagen kann, was T zur Kompilierzeit ist (ist das überhaupt nicht der Punkt von Generika?). –