如何在 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 的情况。我能做些什么:
- 我还有一个
data
class
- 我的所有变量都在构造函数中
- 我只有
T
类型的所有变量,而不是 T?
(即不可为空)
- 在将 JSONString 转换为 Response class 的对象时,我可以创建一个唯一的实例,即使是可为空的数据(就像我将变量
id
设为 null ,我仍然能够创建一个实例并且逻辑应该 运行 那 if value==null, return <results from my logic for creating a random id>
- 我应该对定义第 4 点中所述的转换逻辑有更多的控制权(例如,如果
id
收到 null
,我可以使用复杂的逻辑来生成唯一的 id,但是如果说 img_url
收到 null
,我可以简单地将其存储为 "no data"
(即,针对不同类型的 null 转换的多个逻辑))
- 我希望这个问题是通过 Kotlin 解决的,而不是通过来自
Gson
或 Room
的第三方黑客解决的
如果其中一种响应参数类型有可能为 null,则必须选择以下选项之一:
将类型更改为可为空,因此:
data class NetworkResponse constructor(val title: String?)
设置参数的默认值,如下所示:
data class NetworkResponse constructor(val title: String = "")
如果你想在这个值为 null 时使用更高级的逻辑,你也可以注册一个 JsonDeserializer
并编写逻辑将 null/empty 值转换为你喜欢的任何值:
GsonBuilder().registerTypeAdapter(type, MyCustomJsonDeserializer())
我开始从 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 的情况。我能做些什么:
- 我还有一个
data
class - 我的所有变量都在构造函数中
- 我只有
T
类型的所有变量,而不是T?
(即不可为空) - 在将 JSONString 转换为 Response class 的对象时,我可以创建一个唯一的实例,即使是可为空的数据(就像我将变量
id
设为 null ,我仍然能够创建一个实例并且逻辑应该 运行 那if value==null, return <results from my logic for creating a random id>
- 我应该对定义第 4 点中所述的转换逻辑有更多的控制权(例如,如果
id
收到null
,我可以使用复杂的逻辑来生成唯一的 id,但是如果说img_url
收到null
,我可以简单地将其存储为"no data"
(即,针对不同类型的 null 转换的多个逻辑)) - 我希望这个问题是通过 Kotlin 解决的,而不是通过来自
Gson
或Room
的第三方黑客解决的
如果其中一种响应参数类型有可能为 null,则必须选择以下选项之一:
将类型更改为可为空,因此:
data class NetworkResponse constructor(val title: String?)
设置参数的默认值,如下所示:
data class NetworkResponse constructor(val title: String = "")
如果你想在这个值为 null 时使用更高级的逻辑,你也可以注册一个 JsonDeserializer
并编写逻辑将 null/empty 值转换为你喜欢的任何值:
GsonBuilder().registerTypeAdapter(type, MyCustomJsonDeserializer())