你将如何为地图编写TypeConverter?我的方法是由Moshi来做
class Converters() {
val moshi = Moshi
.Builder()
.add(KotlinJsonAdapterFactory())
.build()
val mapOfStringsType = Types.newParameterizedType(Map::class.java, String::class.java, String::class.java)
val mapOfStringsAdapter = moshi.adapter<Map<String, String>>(mapOfStringsType)
@TypeConverter
fun stringToMap(data: String): Map<String, String> {
return mapOfStringsAdapter.fromJson(data).orEmpty()
}
@TypeConverter
fun mapToString(map: Map<String, String>): String {
return mapOfStringsAdapter.toJson(map)
}
}但是,它很难闻,因为我不能通过Converters()构造函数注入Moshi。而且,恐怕这也不是最好的表现。
发布于 2018-10-30 02:12:15
对于TypeConverters房间,我通常使用gson。它允许简单的实现,适用于所有对象类型:
public class StringMapConverter {
@TypeConverter
public static Map<String, String> fromString(String value) {
Type mapType = new TypeToken<Map<String, String>>() {
}.getType();
return new Gson().fromJson(value, mapType);
}
@TypeConverter
public static String fromStringMap(Map<String, String> map) {
Gson gson = new Gson();
return gson.toJson(map);
}
}发布于 2021-06-04 20:28:06
我为原始的Map值提出了一个解决方案。例如String、Boolean、Integer、Long等。更多信息请访问https://kotlinlang.org/docs/basic-types.html。
每次想要从Room数据库中获取一个项目时,创建一个Gson实例的代价可能会很高,在这种情况下,这是一种相当懒惰的解决问题的方法。
如果您曾经看到过转换字符串列表的解决方案,下面的示例应该是不言而喻的。
不是将Map视为Kotlin对象,而是将其视为两个数组:键和值。我们最大的助手是TreeMap,因为Map.keys返回未排序的Set。
@TypeConverter
fun fromStringMap(value: Map<String, String>): String {
val sortedMap = TreeMap(value)
return sortedMap.keys.joinToString(separator = ",").plus("<divider>")
.plus(sortedMap.values.joinToString(separator = ","))
}
@TypeConverter
fun toStringMap(value: String): Map<String, String> {
return value.split("<divider>").run {
val keys = getOrNull(0)?.split(",")?.map { it }
val values = getOrNull(1)?.split(",")?.map { it }
val res = hashMapOf<String, String>()
keys?.forEachIndexed { index, s ->
res[s] = values?.getOrNull(index) ?: ""
}
res
}
}请随意将分隔符"“替换为最适合您的用例,这样您就不会遇到包含分隔符的value/key。
发布于 2020-10-07 11:10:24
根据brian-acker的回应,在Kotlin中使用Moshi的类似TypeConverter将如下所示:
class Converters {
private val mapAdapter =
Moshi.Builder().add(SingleToArray.Adapter.FACTORY).build().adapter<Map<String, String>>(
Map::class.java)
@TypeConverter
fun fromJson(aString: String?): Map<String, String>? =
aString?.let { mapAdapter.fromJson(it) }
@TypeConverter
fun toJson(aMap: Map<String, Any>?): String? =
aMap?.let { anyMapAdapter.toJson(it) }
}https://stackoverflow.com/questions/51912855
复制相似问题