我收到一个带有map包装器Table的JSON数据模型。我正在尝试使用泛型来传递超出包装器范围的类型,但在运行时无法正确转换。下面是我的JSON文件示例:
{
"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
}
]
}
我使用的包装类被称为Table。
data class Table<T>(
@SerializedName("Table") val models : Array<T>
)
实际的模型类是PaymentMethod。
data class PaymentMethod(
@SerializedName("paymentmethod_id") val idNumber : Int = -1
)
我创建了一个通用的数据管理器类,它接受 < T > 类型。我认为使用数据管理器的子类来本地化输入和结果是可行的(例如声明模型类PaymentMethod)。
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)
}
我的子类数据管理器指定要解析的模型。
final public class PaymentMethodsDataManager : NXDataManager<PaymentMethod>
{
constructor () : super("genGetPaymentMethods")
}
当我运行以下代码时:
val table: Table<T> = Gson().fromJson(s)
我收到了一个错误信息java.lang.ClassCastException: java.lang.Object[] 无法转换为 Networking.PaymentMethod[]。然而,当我传入明确的类型时,它按预期工作--将数组解析为PaymentMethod模型:
val table: Table<PaymentMethod> = Gson().fromJson(s)
有什么办法可以继续使用通用类型T吗?