मुझे एक JSON डेटा मॉडल प्राप्त हो रहा है जिसमें नक्शा रैपर तालिका है। मैं जेनरिक्स का उपयोग उस प्रकार से गुजरने के लिए कर रहा हूं जो रैपर से बाहर है लेकिन यह रनटाइम पर अच्छी तरह से अनुवाद नहीं कर रहा है। यहाँ मेरी JSON फ़ाइल का एक उदाहरण है:कोटलिन जीसन 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
}
]
}
आवरण वर्ग मैं उपयोग कर रहा हूँ तालिका कहा जाता है।
data class Table<T>(
@SerializedName("Table") val models : Array<T>
)
वास्तविक मॉडल वर्ग PaymentMethod है।
data class PaymentMethod(
@SerializedName("paymentmethod_id") val idNumber : Int = -1
)
मैंने एक जेनेरिक डेटा मैनेजर क्लास बनाया है जो < टी> प्रकार लेता है। मैं डेटा प्रबंधक के उपयोग उपवर्गों इनपुट और इस तरह के मॉडल वर्ग 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)
}
मेरे subclassed डेटा प्रबंधक मॉडल में पार्स करने के लिए निर्दिष्ट करता है।
final public class PaymentMethodsDataManager : NXDataManager<PaymentMethod>
{
constructor() : super("genGetPaymentMethods")
}
जब मैं के रूप में कोड चलाएँ:
val table: Table<T> = Gson().fromJson(s)
मैंने एक त्रुटि संदेश java.lang.ClassCastExceptio मिल n: java.lang.Object [] को नेटवर्किंग में नहीं डाला जा सकता है। भुगतान विधि []। हालांकि, जब मैं एक स्पष्ट प्रकार में पारित यह उम्मीद के रूप में काम करता है - PAYMENTMETHOD मॉडल में सरणी को पार्स:
val table: Table<PaymentMethod> = Gson().fromJson(s)
कैसे मैं अभी भी सामान्य प्रकार टी का उपयोग कर सकते की कोई भी विचार?
मैं टेबल :: class.java उपयोग करने के लिए सक्षम नहीं था कह सकते हैं। लेकिन यह एक त्रुटि फेंकता है क्योंकि मैं अनुमान लगा रहा हूं कि कंपाइलर यह नहीं बता सकता कि टी संकलन समय पर क्या है (जेनरिक्स के उस बिंदु की पहली जगह नहीं है?)। –