我无法从自定义类中获取泛型类型列表(Turns):
val turnsType = TypeToken<List<Turns>>() {}.typeval turns = Gson().fromJson(pref.turns, turnsType)
val turnsType = TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson(pref.turns, turnsType)
它说:
cannot access '<init>' it is 'public /*package*/' in 'TypeToken'
sh7euo9m1#
创建此内联乐趣:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
你可以这样称呼它:
val turns = Gson().fromJson<Turns>(pref.turns)// orval turns: Turns = Gson().fromJson(pref.turns)
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
先前的替代方案:
备选方案1:
val turnsType = object : TypeToken<List<Turns>>() {}.typeval turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
您必须将object :和特定类型放入fromJson<List<Turns>>
object :
fromJson<List<Turns>>
备选方案2:
正如@柏树提它也可以这样实现:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
用作:
val turnsType = genericType<List<Turns>>()
ha5z0ras2#
这样就解决了问题:
第一行创建一个从TypeToken派生的对象表达式,然后从中获取Java Type。然后Gson().fromJson方法需要为函数的结果指定的类型(该类型应与创建的TypeToken匹配)。该方法有两个版本,如上所述或:
TypeToken
Type
Gson().fromJson
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
为了更容易地创建TypeToken,您可以创建一个helper函数,该函数需要内联,以便它可以使用具体化类型参数:
然后,可以通过以下任一方式使用它:
val turnsType = genericType<List<Turns>>()// orval turnsType: List<Turns> = genericType()
val turnsType: List<Turns> = genericType()
整个过程可以封装到Gson示例的扩展函数中:
Gson
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
这样,您就可以直接调用Gson,而完全不用担心TypeToken:
在这里,Kotlin从赋值语句的一端或另一端使用类型推断,并使用内联函数的具体化泛型来传递完整类型(没有擦除),并使用它来构造TypeToken,同时调用Gson
pnwntuvh3#
另一个选项(不确定它看起来是否比其他选项更优雅)可能是这样的调用:
turns = Gson().fromJson(stringObject, Array<Turns>::class.java).toMutableList()
因此,您使用的是java Array类one liner,而不是“纯Kotlin”。
0aydgbwb4#
val obj: MutableList<SaleItemResponse> = Gson().fromJson(messageAfterDecrypt, object : TypeToken<List<SaleItemResponse>>() {}.type)
val obj: MutableList<SaleItemResponse> = Gson().fromJson(messageAfterDecrypt,
object : TypeToken<List<SaleItemResponse>>() {}.type)
这是我在Kotlin中解析数据数组的方法。
kokeuurv5#
我使用类似的东西来转换T到string & String回到T使用Gson。不完全是你要找的,但以防万一。正在声明扩展名
T
string
String
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)
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 Fragmentcompanion 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 argumentprivate lateinit var shop: Shop override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { shop = it.getString(ARG_SHOP).fromJson() ?: return } }
// 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
qlckcl4x6#
这也是可行的,而且更简单
inline fun <reified T> Gson.fromJson(json: String) : T = this.fromJson<T>(json, T::class.java)
inline fun <reified T> Gson.fromJson(json: String) : T =
this.fromJson<T>(json, T::class.java)
uidvcgyl7#
使用以下代码将Gson的Kotlingeneric reified function反序列化为ArrayList<T>
generic reified function
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> 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
7条答案
按热度按时间sh7euo9m1#
创建此内联乐趣:
你可以这样称呼它:
先前的替代方案:
备选方案1:
您必须将
object :
和特定类型放入fromJson<List<Turns>>
备选方案2:
正如@柏树提它也可以这样实现:
用作:
ha5z0ras2#
这样就解决了问题:
第一行创建一个从
TypeToken
派生的对象表达式,然后从中获取JavaType
。然后Gson().fromJson
方法需要为函数的结果指定的类型(该类型应与创建的TypeToken
匹配)。该方法有两个版本,如上所述或:为了更容易地创建
TypeToken
,您可以创建一个helper函数,该函数需要内联,以便它可以使用具体化类型参数:然后,可以通过以下任一方式使用它:
整个过程可以封装到
Gson
示例的扩展函数中:这样,您就可以直接调用Gson,而完全不用担心
TypeToken
:在这里,Kotlin从赋值语句的一端或另一端使用类型推断,并使用内联函数的具体化泛型来传递完整类型(没有擦除),并使用它来构造
TypeToken
,同时调用Gsonpnwntuvh3#
另一个选项(不确定它看起来是否比其他选项更优雅)可能是这样的调用:
因此,您使用的是java Array类one liner,而不是“纯Kotlin”。
0aydgbwb4#
这是我在Kotlin中解析数据数组的方法。
kokeuurv5#
我使用类似的东西来转换
T
到string
&String
回到T
使用Gson
。不完全是你要找的,但以防万一。正在声明扩展名
用途
qlckcl4x6#
这也是可行的,而且更简单
uidvcgyl7#
使用以下代码将Gson的Kotlin
generic reified function
反序列化为ArrayList<T>