我试图用莫希创建一个通用的JSON解析器String to Object,但我不确定我是否做对了,因为我陷入了一个需要处理List的场景。
这个接口的思想是,它可以用Gson或莫希解析器实现
interface JsonParser {
fun <T> fromJson(jsonString: String, type: Class<T>): T?
fun <T> toJson(obj: T, type: Class<T>): String?
}
莫希剖析器范例
class MoshiParser(private val moshi: Moshi) : JsonParser {
override fun <T> fromJson(jsonString: String, type: Class<T>): T? {
return moshi.adapter(type).fromJson(jsonString)
}
override fun <T> toJson(obj: T, type: Class<T>): String? {
return moshi.adapter(type).toJson(obj)
}
}
示例转换器类
@ProvidedTypeConverter
class JsonConverter(private val jsonParser: JsonParser) {
@TypeConverter
fun fromMetricsJson(jsonString: String): MetricsDomain {
return jsonParser.fromJson(jsonString, MetricsDomain::class.java)
?: MetricsDomain() // Empty
}
@TypeConverter
fun toMetricsJson(obj: MetricsDomain): String {
return jsonParser.toJson(obj, MetricsDomain::class.java)
?: DEFAULT_VALUE_STRING // Empty
}
}
但是我怎么能处理像List这样的东西呢?
@TypeConverter
fun fromHistoricalValuesJson(jsonString: String): List<List<Double>> {
return jsonParser.fromJson(jsonString, // How to do this in Moshi)
?: emptyList()
}
在Gson中,我认为我们可以像object : TypeToken<ArrayList<List<Double>>>(){}.type
那样做,在莫希中,我们可以根据文档使用物化扩展,但在这种情况下我不能这样做。
// We can just use a reified extension!
val adapter = moshi.adapter<List<Card>>()
示例数据类
@Parcelize
data class MetricsDomain(
val riskMetricsDomain: RiskMetricsDomain = RiskMetricsDomain(),
val roiByYearDomain: RoiByYearDomain = RoiByYearDomain(),
val roiDataDomain: RoiDataDomain = RoiDataDomain(),
val supplyDomain: SupplyDomain = SupplyDomain()
) : Parcelable
2条答案
按热度按时间5kgi1eie1#
只需将这两个函数放入一个Kotlin文件中:
并在转换器中使用:
gxwragnw2#
多亏了@Eric注解,我们才能使用泛型类型来完成它。
在您的
@ProvidedTypeConverter
注解类中