kotlin Koltin空值检查不适用于房间类型转换器功能

8wtpewkr  于 2022-11-25  发布在  Kotlin
关注(0)|答案(3)|浏览(171)

假设我有一个JSON,您可以看到在“对象1”中有faq数组,但在“对象2”中没有,因此我会检查它是否为空,但在检查为空后,Kotlin仍运行条件体并将其值打印为空

[
  {
    "name": "Object 1",
    "faq": [
      {
        "question": "A Question?",
        "answer": "Answer"
      }
    ],
    ...
  },
  {
    "name": "Object 2",
    ...
  },
]

我用这个代码来转换这个

class Converters {

    @TypeConverter
    fun faqListToJSON(value: List<FAQ>?): String = Gson().toJson(value)

    @TypeConverter
    fun jsonToFAQ(value: String?): List<FAQ> {

        if(value != null) {

            val faq = object : TypeToken<List<FAQ>>() {}.type

            Log.e("Converter", "jsonToFAQ: $value")

            return Gson().fromJson(value, faq)
        }

        return emptyList()
    }

}

这是对象和FAQ对象模型类

data class Object(

    ...

    var faq: List<FAQ>? = null
)

data class FAQ(val question: String, val answer: String)

并且给出这个错误日志,即使我已经首先检查了null

2021-02-02 00:04:13.565 24185-24447/com.burhankhanzada.android.pakistannetworksbundlesoffers.debug E/Converter: jsonToFAQ: null
    Process: com.burhankhanzada.android.pakistannetworksbundlesoffers.debug, PID: 24185
    java.lang.NullPointerException: Gson().fromJson(value, faq) must not be null
        at com.burhankhanzada.android.pakistannetworksbundlesoffers.data.Converters.jsonToFAQ(Converters.kt:29)
        at com.burhankhanzada.android.pakistannetworksbundlesoffers.data.othercodes.OtherCodeDao_Impl$3.call(OtherCodeDao_Impl.java:289)
        at com.burhankhanzada.android.pakistannetworksbundlesoffers.data.othercodes.OtherCodeDao_Impl$3.call(OtherCodeDao_Impl.java:187)
plicqrtu

plicqrtu1#

你能试试这个吗?

@TypeConverter
fun jsonToFAQ(value: String?): List<FAQ>? {
return if (value != null) {
    Gson().fromJson(string, Array<FAQ>::class.java).toList()
} else {
    null
}
bprjcwpo

bprjcwpo2#

对于此解决方案,我的解决方案是这样的,正如您在我的实体中所看到的,我已经声明了此字段可以为null var faq: List<FAQ>? = null,因此,请在TypeConverter中检查null,只需将其直接转换为如下所示

@TypeConverter
fun jsonToFAQ(value: String) = Gson().fromJson(value, Array<FAQ>::class.java).toList()

然后在使用此字段的任何位置选中null

siv3szwd

siv3szwd3#

这对我很有效

class StoryCacheConverters {

@TypeConverter
fun listToJson(value: List<StoryMediaCacheItem>?): String = Gson().toJson(value)

@TypeConverter
fun jsonToList(value: String?): List<StoryMediaCacheItem>? = if(value != null) {
    Gson().fromJson(value, object : TypeToken<List<StoryMediaCacheItem>?>() {}.type)
}else null

}

相关问题