Hob*_*ige 6 android gson kotlin
我收到一个有地图包装表的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
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的包装类名为Table.
data class Table<T>(
@SerializedName("Table") val models : Array<T>
)
Run Code Online (Sandbox Code Playgroud)
实际的模型类是PaymentMethod.
data class PaymentMethod(
@SerializedName("paymentmethod_id") val idNumber : Int = -1
)
Run Code Online (Sandbox Code Playgroud)
我创建了一个采用<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)
}
Run Code Online (Sandbox Code Playgroud)
我的子类数据管理器指定要解析的模型.
final public class PaymentMethodsDataManager : NXDataManager<PaymentMethod>
{
constructor () : super("genGetPaymentMethods")
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时:
val table: Table<T> = Gson().fromJson(s)
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息java.lang.ClassCastException:java.lang.Object []无法强制转换为Networking.PaymentMethod [].但是,当我传入一个显式类型时,它按预期工作 - 将数组解析为PaymentMethod模型:
val table: Table<PaymentMethod> = Gson().fromJson(s)
Run Code Online (Sandbox Code Playgroud)
我仍然可以使用泛型T的任何想法?
数据类:
data class Table<T>(
@SerializedName("Table") val models : Array<T>
)
Run Code Online (Sandbox Code Playgroud)
到JSON:
val gson = Gson()
val json = gson.toJson(table)
Run Code Online (Sandbox Code Playgroud)
来自JSON:
val json = getJson()
val table = gson.fromJson(json, Table::class.java)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4780 次 |
| 最近记录: |