如何在 Kotlin 中处理 GSON 的 null 情况?

How can I handle null cases for GSON in Kotlin?

我开始从 Java 过渡到 Kotlin。我有以下数据 class:

data class NetworkResponse constructor(val title: String)

稍后 GSON 将使用此 class 将 JSON 文件转换为此 class 的对象。但 title 有可能收到 null.

在 Java 中,这在从 JSON 转换为对象时不是问题(但由于我没有对字符串使用 ? 符号,它可能是),但这绝对是在 Room 数据库中存储数据数据时的一个问题,因为我不想添加空值,并且我使用与 @Entity 相同的 class。

在Java中,我曾经在setter中添加了将null转换为某个值(比如uuid)的逻辑,但在这里我不能做这样的事情,因为构造函数没有主体而且我必须使用 init,这意味着我必须在构造函数之外声明我的变量,这也不是 data class 的情况。我能做些什么:

  1. 我还有一个dataclass
  2. 我的所有变量都在构造函数中
  3. 我只有 T 类型的所有变量,而不是 T?(即不可为空)
  4. 在将 JSONString 转换为 Response class 的对象时,我可以创建一个唯一的实例,即使是可为空的数据(就像我将变量 id 设为 null ,我仍然能够创建一个实例并且逻辑应该 运行 那 if value==null, return <results from my logic for creating a random id>
  5. 我应该对定义第 4 点中所述的转换逻辑有更多的控制权(例如,如果 id 收到 null,我可以使用复杂的逻辑来生成唯一的 id,但是如果说 img_url 收到 null,我可以简单地将其存储为 "no data"(即,针对不同类型的 null 转换的多个逻辑))
  6. 我希望这个问题是通过 Kotlin 解决的,而不是通过来自 GsonRoom
  7. 的第三方黑客解决的

如果其中一种响应参数类型有可能为 null,则必须选择以下选项之一:

  1. 将类型更改为可为空,因此:

    data class NetworkResponse constructor(val title: String?)

  2. 设置参数的默认值,如下所示:

    data class NetworkResponse constructor(val title: String = "")

如果你想在这个值为 null 时使用更高级的逻辑,你也可以注册一个 JsonDeserializer 并编写逻辑将 null/empty 值转换为你喜欢的任何值:

GsonBuilder().registerTypeAdapter(type, MyCustomJsonDeserializer())