处理空值的最佳方法Moshi-Kotlin/Retrofit

bq3bfh9z  于 2022-12-13  发布在  Kotlin
关注(0)|答案(1)|浏览(160)

我正在使用一个API为我的应用程序获取一些使用Retrofit和莫希的配方。当接收到的值不为空时,一切都正常。一旦我接收到为空的东西,我的整个应用程序就停止说-缺少的值为空。
我在网上找到了这个解决方案-

object NULL_TO_EMPTY_STRING_ADAPTER {
  @FromJson fun fromJson(reader: JsonReader): String {
    if (reader.peek() != JsonReader.Token.NULL) {
      return reader.nextString()
    }
    reader.nextNull<Unit>()
    return ""
  }
}

如果我是正确的,上面的适配器返回“”为空值?自从实现这个适配器,我的应用程序还没有崩溃。虽然,我想问,什么是最好的方式来处理这些空值从API接收。
下面是我的一个Data类的一个例子:

data class Recipe(
    val vegetarian: Boolean = false,
    val vegan: Boolean = false,
    val glutenFree: Boolean = false,
    val dairyFree: Boolean = false,
    val veryHealthy: Boolean = false,
    val cheap: Boolean = false,
    val veryPopular: Boolean = false,
    val sustainable: Boolean = false,
    val lowFodmap: Boolean = false,
    val weightWatcherSmartPoints: Long = 0L,
    val gaps: String = "",
    val preparationMinutes: Long = 0L,
    val cookingMinutes: Long = 0L,
    val aggregateLikes: Long = 0L,
    val healthScore: Long = 0L,
    val creditsText: String = "",
    val license: String = "",
    val sourceName: String = "",
    val pricePerServing: Double = 0.0,
    val extendedIngredients: List<ExtendedIngredient>? = null,
    val id: Long = 0L,
    val title: String = "",
    val readyInMinutes: Long = 0L,
    val servings: Long = 0L,
    val sourceUrl: String = "",
    val image: String = "",
    val imageType: String = "",
    val summary: String = "",
    val cuisines: List<String> = listOf(""),
    val dishTypes: List<String> = listOf(""),
    val diets: List<String> = listOf(""),
    val occasions: List<String> = listOf(""),
    val instructions: String = "",
    val analyzedInstructions: List<AnalyzedInstruction>? = null,
    val originalId: Any? = null,
    val spoonacularSourceUrl: String = "",
)

在使用此NULL_TO_EMPTY_STRING_ADAPTER适配器之前,当我从服务器接收到空值时,即使我已将数据类字段设置为空值或默认值,我的应用程序也会崩溃。
请告诉我,我希望我的应用程序进入生产时,它是完整的。谢谢。

m0rkklqb

m0rkklqb1#

在我看来,在使用网络模型时处理空值的最好方法是使所有字段都为空。因此,您可以确保即使该字段为空,应用程序也不会崩溃。您可以做的是,这是一个简短的示例。

data class Recipe(
    val title: String? = null,
    val vegetarian: Boolean? = false,
    val vegan: Boolean? = false
)

 val recipe = Recipe(null, false, false)
 /*use the title like this*/ recipe.title.orEmpty()

orEmpty()是字符串特定的扩展函数,如果字符串不为空则返回字符串本身,如果字符串为空则返回空字符串。

相关问题