আমি একটি কাস্টম ক্লাস (টার্নস) থেকে জেনেরিক ধরণের তালিকা পেতে অক্ষম:
val turnsType = TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson(pref.turns, turnsType)
এটি বলেছিল:
cannot access '<init>' it is 'public /*package*/' in 'TypeToken'
আমি একটি কাস্টম ক্লাস (টার্নস) থেকে জেনেরিক ধরণের তালিকা পেতে অক্ষম:
val turnsType = TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson(pref.turns, turnsType)
এটি বলেছিল:
cannot access '<init>' it is 'public /*package*/' in 'TypeToken'
উত্তর:
এই ইনলাইন মজা তৈরি করুন:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
এবং তারপরে আপনি এটিকে কল করতে পারেন:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
পূর্ববর্তী বিকল্পগুলি:
বিকল্প 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
আপনাকে লাগাতে হবে object :এবং নির্দিষ্ট টাইপটি লিখতে হবেfromJson<List<Turns>>
বিকল্প 2:
@ চিত্তাকর্ষক উল্লেখ হিসাবে এটি এই উপায়েও অর্জন করা যেতে পারে:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
হিসাবে ব্যবহত:
val turnsType = genericType<List<Turns>>()
এটি সমস্যার সমাধান করে:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
প্রথম লাইনটি একটি অবজেক্ট এক্সপ্রেশন তৈরি করে যা থেকে নেমে আসে TypeTokenএবং তার পরে জাভা পায় Type। তারপরে Gson().fromJsonপদ্ধতিটি হয় ফাংশনের ফলাফলের জন্য নির্দিষ্ট ধরণের প্রয়োজন (যা TypeTokenতৈরির সাথে মিলিত হওয়া উচিত )। এই কাজের দুটি সংস্করণ যেমন উপরে বা:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
এটি তৈরি করা সহজ করার জন্য TypeTokenআপনি কোনও সহায়ক ফাংশন তৈরি করতে পারেন, যা ইনলাইন হওয়া দরকার যাতে এটি রিফাইড টাইপ পরামিতি ব্যবহার করতে পারে :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
যা এর পরে এই যে কোনও একটির জন্য ব্যবহার করা যেতে পারে:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
এবং পুরো প্রক্রিয়াটি Gsonউদাহরণস্বরূপ কোনও এক্সটেনশন ফাংশনে আবৃত হতে পারে :
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
যাতে আপনি কেবল গসনকে কল করতে পারেন এবং একেবারেই চিন্তা করবেন না TypeToken:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
এখানে কোটলিন অ্যাসাইনমেন্টের একপাশ থেকে অন্য দিক থেকে টাইপ ইনফারেন্স ব্যবহার করছে এবং পূর্ণ প্রকারের (ক্ষয় ছাড়াই) অতিক্রম করার জন্য একটি ইনলাইন ফাংশনটির জন্য জেনেরিকগুলি সংশোধন করছে এবং এটি নির্মাণের জন্য এবং জিসনে TypeTokenকল করার জন্য ব্যবহার করছে
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()বা ঠিক Gsonযেমন স্থির? আপনার প্রথমটি প্রয়োজন, একটি উদাহরণ।
অন্য একটি বিকল্প (এটি অন্যদের তুলনায় আরও মার্জিত বলে নিশ্চিত নয়) এর জন্য এই কল হতে পারে:
turns = Gson().fromJson(allPurchasesString, Array<Turns>::class.java).toMutableList()
সুতরাং আপনি "খাঁটি কোটলিন" এর পরিবর্তে জাভা অ্যারে ক্লাস ওয়ান লাইনার ব্যবহার করছেন।
আমি রূপান্তর Tকরতে stringএবং ব্যবহারে Stringফিরে যেতে এরকম কিছু Tব্যবহার করেছি Gson। আপনি যা খুঁজছেন ঠিক তা নয় তবে কেবল ক্ষেত্রে।
ঘোষণা বাড়ানো হচ্ছে
inline fun <reified T : Any> T.json(): String = Gson().toJson(this, T::class.java)
inline fun <reified T : Any> String.fromJson(): T = Gson().fromJson(this,T::class.java)
ব্যবহার
// Passing an object to new Fragment
companion object {
private const val ARG_SHOP = "arg-shop"
@JvmStatic
fun newInstance(shop: Shop) =
ShopInfoFragment().apply {
arguments = Bundle().apply {
putString(ARG_SHOP, shop.json())
}
}
}
// Parsing the passed argument
private lateinit var shop: Shop
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
shop = it.getString(ARG_SHOP).fromJson() ?: return
}
}
এটি পাশাপাশি কাজ করে, এবং সহজ
inline fun <reified T> Gson.fromJson(json: String) : T =
this.fromJson<T>(json, T::class.java)
Kotlin generic reified functionGson এর deserialize ArrayList<T>এই কোড ব্যবহার
inline fun <reified T> get( ... ): ArrayList<T>{
val str = "[{},{}]"
val type = TypeToken.getParameterized(ArrayList::class.java, T::class.java).type
val t = Gson().fromJson<ArrayList<T>>(str, type)
return t
}
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type